令人头疼的反复读机
反-复读机

我们在处理字符串的时候经常会出现各种问题,而这题也确实恶心到我了,先上代码。
#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++。这样输入的时候就会跳过判断过程中的输入。
浙公网安备 33010602011771号