POJ2185 Milking Grid KMP两次(二维KMP)较难

 
大概算是我学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 }
View Code

 

posted @ 2017-11-05 08:33  鲸头鹳  阅读(119)  评论(0编辑  收藏  举报