转载请注明出处:http://blog.csdn.net/a1dark
分析:其实这题没有想象中的那么难、由于这题数量达到了100W、所以只能在线性时间内算出才行、咋一看貌似KMP扩展、其实只需要普通的KMP就可以解决、不过需要重新构造一个新字符串C=B+A、于是求出字符串C的next值、最后的值便是answer、
#include<stdio.h>
#include<string.h>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=1000010;
char str1[maxn];
char str2[maxn];
int next[2*maxn];
char str3[2*maxn];
int len1,len2;
int getnext(){
int j=0,k=-1;
next[0]=-1;
int len=strlen(str3);
while(j<len){
if(k==-1||str3[j]==str3[k]){
j++;
k++;
next[j]=k;
}
else k=next[k];
}
int ans=0;
ans=min(len1,len2);
ans=min(ans,k);
return ans;
}
int main(){
int n,m,k;
while(scanf("%s%s",str1,str2)!=EOF){
len1=strlen(str1);
len2=strlen(str2);
memset(str3,'\0',sizeof(str3));
for(int i=0;i<len2;i++){
str3[i]=str2[i];
}
for(int i=len2,j=0;i<len1+len2,j<len1;i++,j++){
str3[i]=str1[j];
}
printf("%d\n",getnext());
}
return 0;
}
/**************************************************************
Problem: 1535
User: verticallimit
Language: C++
Result: Accepted
Time:360 ms
Memory:12740 kb
****************************************************************/