题解 CF20A 【BerOS file system】
这一题耗费了我巨多的心血(痛)
第一边做:
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char a[1000005];
cin>>a;
int i=strlen(a);
for(int n=0;n<i;n++)
{
if(a[n]==a[n-1]&&a[n]=='/')
continue;
cout<<a[n];
}
}
第六个点凉了
……
然后我分析原因,发现没有去尾
然后改了
第二遍做:
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char a[1000005];
cin>>a;
int i=strlen(a);
for(int n=0;n<i;n++)
{
if(a[n]==a[n-1]&&a[n]=='/')
continue;
if(n==i-1&&a[n]=='/')
continue;
cout<<a[n];
}
}
又凉了,这次是第四个点
然后我再次分析原因
发现这样做会“死”在“/”上
哎
第三遍做:
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char a[1000005];
cin>>a;
int i=strlen(a);
bool k=0;
for(int n=0;n<i;n++)
{
if(a[n]!='/')
k=1;
if(a[n]==a[n-1]&&a[n]=='/')
continue;
if(a[n]=='/'&&n==i-1&&k==1)
continue;
cout<<a[n];
}
}
仍然凉了,还是第六个点
再次检查,发现BUG!
这个程序只适用于结尾只有一个“/”的情况
然而测试点应该至少有两个!!!
不过,这种情况会将结尾的“/”变成一个
所以不妨,两次循环
先不说别的,看我的AC代码(第四遍做)
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char a[1000005],p[1000005];
cin>>a;
int q=0;
int i=strlen(a);
bool k=0;//这个是判断有没有字母的,以防被“////”这种情况坑
for(int n=0;n<i;n++)
{
if(a[n]!='/')
k=1;//有字母
if(a[n]==a[n-1]&&a[n]=='/')//必要
continue;//循环催眠
if(a[n]=='/'&&n==i-1&&k==1)//这句似乎没用,但是留着吧
continue;
p[q]=a[n];//做完去重,然后读入
q++;
}
//经过这一番捯饬,终于结尾只剩一个“/”了
for(int n=0;n<q;n++)
{
if(p[n]!='/')
k=1;
if(p[n]==p[n-1]&&p[n]=='/')//从上面复制的,懒得删
continue;
if(p[n]=='/'&&n==q-1&&k==1)//必要
continue;
cout<<p[n];
}
}