令人头疼的反复读机

反-复读机

 

  我们在处理字符串的时候经常会出现各种问题,而这题也确实恶心到我了,先上代码。

#include<stdio.h>
#include<string.h>
int bi(char *a,char*b,int n);
int main()
{
    int n,m;
    scanf("%d",&n);
    getchar();
    char a[15][101];
    gets(a[0]);
    for(int j=0;j<n;j++){
        int i=0;
        m=strlen(a[i]);
        gets(a[i+1]);
        if(j<n-1&&bi(a[i],a[i+1],m)==0&&n>=3){
            puts(a[i]);
            i++;
            j++;
            gets(a[i+1]);
            if(bi(a[i],a[i+1],m)==0){
                while(bi(a[i],a[i+1],m)==0&&j<n-1){
                    j++;
                    i++;
                    gets(a[i+1]);
                }
            }
            else{
                puts(a[i]);
            }
        }
        else if(j==n-1){
            puts(a[i]);
        }
        else if(n==2){
            puts(a[i]);
            puts(a[i+1]);
            break;
        }
        else {
            puts(a[i]);
        }
        strcpy(a[0],a[i+1]);
    }
}
int bi(char *a,char*b,int n){
    int i,flag=0;
    for(i=0;i<n;i++){
        if(a[i]!=b[i]){
            flag=1;
            break;
        }
    }
    return flag;
}

这题首先要注意的是第一个scanf后面的换行,我用了一个getchar()吃掉它。然后用一个判断函数和一串判断语句搞定,但是这题的数据真的有点恶心,是真的大。

 10的5次方句,每句话100个字符。,也就是说如果我要一次处理存放我就最多要在一个数组中存10的7次方个字符,显而易见不行。所以我决定一边输入一边处理,处理完一部分就丢掉前面的。

这样就大大减少了我的存储数据。最麻烦的是我要保证下次输入要在我要的位置,所以我在i++的过程中也进行j++。这样输入的时候就会跳过判断过程中的输入。

 

posted on 2021-11-10 13:08  超级全能生  阅读(58)  评论(0)    收藏  举报

导航