题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4300
题目思路:可用kmp,也可用扩展kmp;
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<string> #include<queue> #include<algorithm> #include<vector> #include<stack> #include<list> #include<iostream> #include<map> using namespace std; #define inf 0x3f3f3f3f #define M 110000 int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } int next[M],extend[M]; void getnext(char *T) { int i,j,k,m; int l,len; m=strlen(T); j=0; while(j+1<m&&T[j]==T[j+1]) j++; next[1]=j;k=1; for(i=2;i<m;i++) { len=k+next[k]-1;l=next[i-k]; if(l<len-i+1) next[i]=l; else { j=max(0,len-i+1); while(i+j<m&&T[j]==T[i+j]) j++; next[i]=j;k=i; } } } void exkmp(char *S,char *T) { int i,j,k,l,len,m,n; n=strlen(S); m=strlen(T); j=0; while(j<m&&j<n&&T[j]==S[j]) j++; extend[0]=j;k=0; for(i=1;i<n;i++) { len=k+extend[k]-1;l=next[i-k]; if(l<len-i+1) extend[i]=l; else { j=max(0,len-i+1); while(i+j<n&&j<m&&S[i+j]==T[j]) j++; extend[i]=j;k=i; } } } char mp1[100],mp2[100],s[M],str[M]; int main() { int t; int i,j,len; scanf("%d",&t); while(t--) { scanf("%s%s",mp1,s); for(i=0;i<26;i++) mp2[mp1[i]-'a']=i; len=strlen(s); for(i=0;i<len;i++) { str[i]=mp2[s[i]-'a']+'a'; } str[len]=0; getnext(str); exkmp(s,str); int flag=0; for(i=(len+1)/2;i<len;i++) { if(extend[i]==len-i) { printf("%s",s); for(j=extend[i];j<i;j++) printf("%c",str[j]); puts(""); flag=1; break; } } if(!flag) { printf("%s",s); printf("%s\n",str); } } }