kmp解法。PS:本人认为正确的kmp写法,网上的kmp样式太多了。 #include<iostream> #include<string> using namespace std; class node { public: char str[110]; }; node st[110]; int n; void getnext(char s[],int next[],int len) { int i,j; next[0]=-1;i=0;j=-1; while(i<len) { if(j==-1||s[i]==s[j]) { ++i;++j; if(s[i]!=s[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int kmp(char s[],char m[]) { int i=0,j=0; int l2=strlen(m),l1=strlen(s); if(l2>l1) return 0; int next[110]; getnext(m,next,l2); while(i<l1&&j<l2) { if(j==-1||s[i]==m[j]) { i++;j++; } else j=next[j]; } if(j>=l2) return 1; return 0; } int solve() { int maxlen=0; char str1[110],str2[110]; int k,i,j,nowlen=strlen(st[0].str ),len=nowlen; while(nowlen>0) { for(i=0;i<=len-nowlen;i++) { strncpy(str1,st[0].str +i,nowlen); //strrev(str2); //行不通,提交不过 str1[nowlen]='/0'; for(j=0;j<nowlen;j++) str2[j]=str1[nowlen-j-1]; str2[j]='/0'; bool flag=true; for(j=0;j<n;j++) { // if(strstr(st[j].str ,str1)==NULL&&strstr(st[j].str ,str2)==NULL) if(!kmp(st[j].str ,str1)&&!kmp(st[j].str ,str2)) { flag=false; break; } } if(flag) return nowlen; } nowlen--; } return 0; } int main() { int t,i; cin>>t; while(t--) { cin>>n; for(i=0;i<n;i++) cin>>st[i].str ; int minlen=strlen(st[0].str ),k=0; for(i=1;i<n;i++) if(strlen(st[i].str )<minlen) { minlen=strlen(st[i].str ); k=i; } char str[110]; strcpy(str,st[0].str ); strcpy(st[0].str ,str); strcpy(st[k].str ,str); printf("%d/n",solve()); } return 0; } 非kmp版本: #include<iostream> #include<string> using namespace std; class node { public: char str[110]; }; node st[110]; int n; int solve() { int maxlen=0; char str1[110],str2[110]; int k,i,j,nowlen=strlen(st[0].str ),len=nowlen; while(nowlen>0) { for(i=0;i<=len-nowlen;i++) { strncpy(str1,st[0].str +i,nowlen); //strrev(str2); //行不通,提交不过 str1[nowlen]='/0'; for(j=0;j<nowlen;j++) str2[j]=str1[nowlen-j-1]; str2[j]='/0'; bool flag=true; for(j=0;j<n;j++) { if(strstr(st[j].str ,str1)==NULL&&strstr(st[j].str ,str2)==NULL) { flag=false; break; } } if(flag) return nowlen; } nowlen--; } return 0; } int main() { int t,i; cin>>t; while(t--) { cin>>n; for(i=0;i<n;i++) cin>>st[i].str ; int minlen=strlen(st[0].str ),k=0; for(i=1;i<n;i++) if(strlen(st[i].str )<minlen) { minlen=strlen(st[i].str ); k=i; } char str[110]; strcpy(str,st[0].str ); strcpy(st[0].str ,str); strcpy(st[k].str ,str); printf("%d/n",solve()); } return 0; }