AC代码: #include<iostream> #include<string.h> #include<stdio.h> using namespace std; int next[100]; char t[60]; void getnext(char t[]) { int i=0,j=-1; next[0]=-1; while(i<strlen(t)){ if(j==-1 || t[i]==t[j]){ i++; j++; if(t[i]!=t[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int kmp(char s[],char t[]) { getnext(t); int i=0,j=0,len1,len2; len1=strlen(s); len2=strlen(t); while(i<len1&&j<len2){ if(j==-1 || s[i]==t[j]){ i++; j++; } else j=next[j]; } if(j>=len2) return 1; return 0; } void copy(char s[],int len,int pos) { int i,j; for(i=pos,j=0;s[i]&&j<len;i++,j++) t[j]=s[i]; t[j]='/0'; } int main() { int n,i,j; char s1[60],s2[60]; scanf("%d",&n); while(n--){ scanf("%s*c",s1); int l=strlen(s1); for(i=l-1,j=0;i>=0;i--,j++) s2[j]=s1[i]; s2[j]='/0'; int flag=0; for(i=l;i>=1;i--){ for(j=0;s1[j]&&l-j>=i;j++){ copy(s1,i,j); if(kmp(s2,t)){ printf("%s/n",t); flag=1; break; } } if(flag) break; } } return 0; }