将两个字符串连接起来,中间加一个没出现过的字符,getfail一下,就是公共部分。
#include <stdio.h> #include <string.h> char c[200100]; char a[100100]; char b[100100]; int p[200100]; int solve(int len1,char *a,int len2,char *b) { int len=1; int i,j; for(i=0;i<len2;i++) c[len++]=b[i]; c[len]='Z'; for(i=0;i<len1;i++) c[++len]=a[i]; j=0;p[1]=0; for(i=2;i<=len;i++) { while(j>0&&c[i]!=c[j+1]) j=p[j]; if(c[i]==c[j+1]) j++; p[i]=j; } return p[len]; } int main() { int len,len1,len2; int i,j; while(scanf("%s",a)!=EOF) { len1=strlen(a); scanf("%s",b); len2=strlen(b); int ans1=solve(len1,a,len2,b); int ans2=solve(len2,b,len1,a); if(ans1>ans2) { printf("%s",a); printf("%s ",b+ans1); } else if(ans2>ans1) { printf("%s",b); printf("%s ",a+ans2); } else { if(strcmp(a,b)<0) { printf("%s", a); printf("%s ", b+ans1); } else { printf("%s",b); printf("%s ",a+ans1); } } } return 0; }