题解 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];
    }
}