您的位置:首页 > 其它

HDU2594 Simpsons’ Hidden Talents KMP

2016-03-26 13:52 375 查看
题意:给你两个字符串,问你第一个字符串前缀和第二个字符串的后缀最长匹配长度是多少?

思路: 简单的next数组的理解, 连接两字符串,在连接处加一个无关字符,如‘*’,这样做是为了保证不会出现连接后前后缀最大匹配值大于某个字符串的情况,然后直接输出next[strlen(str)]以及其前缀即可。

代码如下:

#include <bits/stdc++.h>

using namespace std;

const int maxn=50005;
char p[maxn<<1];
char p1[maxn];
int NEXT[maxn<<1];

void Op_NEXT(int n){
NEXT[0] = -1;
int k = -1;
int j = 0;
while(j < n){
if(k == -1 || p[k] == p[j]){
j++;
k++;
NEXT[j] = k;
}
else{
k=NEXT[k];
}
}
}

int main()
{
ios::sync_with_stdio(false);
memset(NEXT,0,sizeof(NEXT));
while(cin>>p>>p1){
int len1=strlen(p);
int len2=strlen(p1);
strcat(p,p1);
int len=len1+len2;
Op_NEXT(len);
while(NEXT[len]>len1 || NEXT[len]>len2) len=NEXT[len];
int res=NEXT[len];
if(res){
for(int i=0;i<res;i++) cout<<p[i];
cout<<" "<<res<<endl;
}
else {
cout<<res<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: