比较好的题目,贴出来做个标记...
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; char input[10005][100]; int R,C,suffix[10005]; int buck[100]; void KMP1(char *s) { int k=0,i; suffix[0]=0; for(i=1;i<C;++i) { while(k>0&&s[k]!=s[i]) k=suffix[k-1]; if(s[k]==s[i]) k++; suffix[i]=k; } i=C-1; while(i>=0) { buck[C-suffix[i]]++; i=suffix[i]-1; } } void KMP2() { int k=0,i; suffix[0]=0; for(i=1;i<R;++i) { while(k>0&&(strcmp(input[k],input[i])!=0)) k=suffix[k-1]; if(strcmp(input[k],input[i])==0) k++; suffix[i]=k; } } int main() { int i,j,area,w,l; while(scanf("%d %d",&R,&C)!=EOF) { for(i=0;i<R;++i) { getchar(); for(j=0;j<C;++j) scanf("%c",&input[i][j]); } area=0,w=0,l=0; memset(buck,0,sizeof(buck)); for(i=0;i<R;++i) KMP1(input[i]); for(i=1;i<=C;++i) if(buck[i]==R) { l=i; break; } KMP2(); w=R-suffix[R-1]; // cout<<w<<" "<<l<<endl; area=w*l; printf("%d\n",area); } return 0; }