题意分析:
这道题是说给你两个字符串s1和s2,要求是如果s1的前缀和s2的后缀相等,输出这个字符串且输出其长度。对于不理解KMP算法真正思想的同学来说可能感觉这道题太蛋疼了,用暴力的话明显会超时,用KMP的又不对。其实KMP课本上讲的太高大上了,不接地气。KMP说白了,就是给你一个字符串,在该字符串第I个位置上,next【i】就表示在该位置前的某一个位置上开始到该位置的一段字符跟从该字符串开始能匹配的长度,例如:ababa这个字符串,从第三个字符a的前面某一个字符开始跟从该字符串开始能才相互匹配的字符个数是1,就是第三个字符能跟开头的a相匹配,所以next【3】=1.所以这道题说白了就是考察对next函数的理解。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int next[10010];
void get_next(string s) {
int i=0,j=-1;
next[0]=-1;
while(i<s.size()) {
if(j==-1 || s[i] == s[j]) {
++i; ++j;
next[i] = j;
}
else j = next[j];
}
}
int main() {
char s[10010],s1[5005],s2[5005];
while(cin>>s1>>s2) {
memset(s,0,sizeof(s));
memset(next,0,sizeof(next));
strcat(s,s1);
strcat(s,s2);
get_next(s);
int len = strlen(s),len1=strlen(s1),len2=strlen(s2);
int te = next[len];
//for(int i=0; i<=len; i++) cout<<next[i]<<' ';
//cout<<endl;
if(te==0) cout<<0<<endl;
else if(te<=len2&&te<=len1) {
cout<<s+(len2+len1-te)<<' '<<te<<endl;
}
else {
int mi = len1>len2? len2 : len1,i;
//cout<<mi<<endl;
char ch1[5005],ch2[5005];
for(i=mi; i>0; i--) {
memset(ch1,0,sizeof(ch1));
memset(ch2,0,sizeof(ch2));
strncpy(ch1,s1,i);
//cout<<ch1<<endl;
strcpy(ch2,s+len-i);
//cout<<ch2<<endl;
if(strcmp(ch1,ch2)==0) {
cout<<ch1<<' '<<i<<endl;
break;
}
}
if(i==0) cout<<0<<endl;
}
}
return 0;
}