您的位置:首页 > 其它

HDU4763 Theme Section KMP-next应用

2016-03-26 13:24 176 查看
题意:给你一个字符串,若将它分割成 AXAXA 的形式,A最长是多少?

思路:对于这道题我看了很多题解,但感觉讲的还是很模糊,这道题从next数组入手即可,很短的代码便可搞定,主要要了解一点如果给你一个长度为n的字符串,那么前后缀的最大匹配值自然是next
,那么次长前后缀匹配值是什么呢? 其实就是next[ next
] ,我们可以通过找出前后缀的匹配值然后知道中间子串的上下界,然后再这个区间看能否找到子串即可,若不能,换成次长前后缀匹配继续求解,以此类推。

代码如下:

#include <bits/stdc++.h>

using namespace std;

const int maxn=1e6+5;
char p[maxn];
int NEXT[maxn];

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

int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--){
cin>>p;
get_NEXT();
int n = strlen(p);
int F = NEXT
;
int ans = 0;
for(int i=F;i>0;i=NEXT[i]){
for(int j=i;j<=n-i;j++){
if(NEXT[j] == i){
ans=i;
goto stop;
}
}
}
stop:
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: