大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一样上下对齐的平铺 , 刚开始以为像地砖一样可以交错着铺 . . .
需要两次kmp..我用的是题解的方法写第一次kmp...这样找起来似乎更清晰.
下面是代码
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=10010; 9 const double eps=1e-8; 10 const long long modn=1000; 11 char a[maxn][100]={}; 12 char s[100]={}; 13 int nex[maxn]={}; 14 int f[100]={}; 15 int n,m; 16 int main(){ 17 scanf("%d%d",&n,&m); 18 int x,y; 19 for(int i=0;i<n;i++){ 20 scanf("%s",&a[i]); 21 strcpy(s,a[i]); 22 for(int j=m-1;j>0;j--){ 23 s[j]=0; 24 for(x=0,y=0;a[i][y];x++,y++){//x for s,y for a 25 26 if(s[x]==0){ 27 x=0; 28 } 29 if(s[x]!=a[i][y]){ 30 break; 31 } 32 } 33 if(!a[i][y]){ 34 f[j]++; 35 } 36 } 37 } 38 int i,j; 39 for(i=0;i<m;i++){ 40 if(f[i]==n){ 41 break; 42 } 43 }int cnt=i; 44 j=-1,nex[0]=-1,i=0; 45 while(i<n){ 46 if(j==-1||strcmp(a[i],a[j])==0){ 47 nex[++i]=++j; 48 }else{ 49 j=nex[j]; 50 } 51 } 52 printf("%d",(n-nex[n])*cnt); 53 return 0; 54 }