USACO
1.3.3 Calf Flac
题意:给出一个可能是多行的字符串,忽略字符串中出现的除了字母以外的字符,找出最长的回文数,输出这个回文的长度,并且忽略掉这个回文的开头和结束的非法字符,但是回文中间的非法字符要输出,输出这个回文。
这道题目让我重新理解了EOF的意义,之前做过的题目都是收进一组数据处理一组,看到处理结果之后再收进下一组,但是这道题目在一组数据中就会出现连续接收的情况,所以看不到运行结果。用判题器Debug呵呵,调了好久。
细节+代码:
/* ID: 15257142 LANG: C TASK: calfflac */ #include<stdio.h> #include<string.h> #include<ctype.h> char a[30000],b[30000],c[30000]; int m,front[30000],behind[30000],x,y,temp,frontpart[30000],behindpart[30000]; int record(int t,int k,int count){ while(t>=1&&k<=m-1){ t--; k++; while(islower(b[t])==0&&t>=1) //翻课本查来的函数,好用。还有头文件。 t--; while(islower(b[k])==0&&k<=m-1) k++; if(b[t]!=b[k]){ frontpart[count] = x; behindpart[count] = y; break; } if(t==0||k==m){ //最后一组数据的关键。 frontpart[count] = t; behindpart[count] = k; } x = t; y = k; temp = temp+2; } return temp; } int main(){ freopen("calfflac.in", "r", stdin); freopen("calfflac.out", "w", stdout); int i,t,k,cmp,length[30000],max,maxnum,g,r,everymax,num1,num2,num3,j; while(gets(c)){ //新写法。 strcat(a,c); m = strlen(a)-1; a[m+1] = '\n'; //题目要求说换行不能算作那80个字符中的。 } for(i = 0;i<=m;i++){ if(a[i]>='A'&&a[i]<='Z') b[i] = a[i]-'A'+'a'; else b[i] = a[i]; length[i] = 0; } for(i = 0;i<=m;i++){ if(islower(b[i])==0) continue; g = i-1; r = i+1; while(g>=1&&islower(b[g])==0) g--; while(r<=m-1&&islower(b[r])==0) r++; num1 = num2 = num3 = temp = 0; if(b[i]==b[r]){ temp = 2; num1 = record(i,r,1); } if(b[i]==b[g]){ temp = 2; num2 = record(g,i,2); } if(b[g]==b[r]){ temp = 3; num3 = record(g,r,3); } if(num1>num2){ cmp = 1; everymax = num1; } else{ cmp = 2; everymax = num2; } if(cmp>num3) cmp = cmp; else{ cmp = 3; everymax = num3; } length[i] = everymax; front[i] = frontpart[cmp]; behind[i] = behindpart[cmp]; } max = 0; for(i = 0;i<=m;i++){ if(length[i]>max){ max = length[i]; maxnum = i; } } printf("%d\n",max); for(i = front[maxnum];i<=behind[maxnum];i++){ printf("%c",a[i]); } printf("\n"); fclose(stdin); fclose(stdout); return 0; }