Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 214 Accepted Submission(s): 89
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 #define eps 1e-8 8 #define zero(x)(((x)>0?(x):-(x))<eps) 9 #define PI acos(-1.0) 10 #define LL long long 11 #define maxn 2200 12 #define IN freopen("in.txt","r",stdin); 13 using namespace std; 14 15 char Str[550][2200]; 16 /*KMP--字符串匹配--单一模版串*/ 17 //char str[maxn],p[maxn];/*p is template string*/ 18 int f[maxn],cnt;//when failed,get to f[i]; 19 void getf(char *p) 20 { 21 memset(f,0,sizeof(f)); 22 int len=strlen(p); /* only cal once, or TLE */ 23 for(int i=1;i<len;i++) 24 { 25 int j=f[i]; 26 while(j&&p[i]!=p[j]) j=f[j]; 27 f[i+1]=(p[i]==p[j]? j+1:0); 28 } 29 } 30 int kmp(char *str,char *p) /*O(len1+len2)*/ 31 { 32 getf(p); 33 cnt=0; 34 int len1=strlen(str),len2=strlen(p); /* only cal once, or TLE*/ 35 for(int i=0,j=0;i<len1;i++) 36 { 37 while(j&&str[i]!=p[j]) j=f[j]; 38 if(str[i]==p[j]) j++; 39 if(j==len2) cnt++;/*Match success*/ 40 if(cnt!=0) break; 41 } 42 return cnt; 43 } 44 45 int main(int argc, char const *argv[]) 46 { 47 //IN; 48 49 int t,ca=1;scanf("%d",&t); 50 while(t--) 51 { 52 int n;scanf("%d",&n); 53 for(int i=1;i<=n;i++) scanf("%s",Str[i]); 54 55 int flag[maxn]={0}; 56 for(int i=1;i<n;i++) 57 if(kmp(Str[i+1],Str[i])!=0) flag[i]=1; 58 59 for(int i=n;i>=1;i--){ 60 for(int j=1;j<i;j++){ 61 if(flag[j]) continue; 62 kmp(Str[i],Str[j]); 63 if(cnt==0){ 64 printf("Case #%d: %d\n",ca++,i);goto s; 65 } 66 } 67 } 68 69 printf("Case #%d: -1\n",ca++); 70 s:continue; 71 } 72 73 return 0; 74 }
HDU 5510 Bazinga (2015沈阳现场赛,子串判断)
原文:http://www.cnblogs.com/Sunshine-tcf/p/4926609.html