您的位置:首页 > 理论基础 > 数据结构算法

HDU 4763 数据结构之KMP+二分

2016-03-22 20:45 330 查看
点击打开链接

题意:求最长的开头与结尾,然后中间还有一样的,但是不能重复利用一个字符

思路:用KMP的next数组,然后用二分求最大值,具体看二分就行了#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1000010;
char str1[maxn];
int Next[maxn],len;
void makenext(int m){
int i=0,j=-1;
Next[i]=-1;
while(i<m){
if(j==-1||str1[i]==str1[j])
Next[++i]=++j;
else j=Next[j];
}
}
bool judge(int x){
if(Next[len]<x||x>=(len+3)/3) return 0;//不符合题目的要求
bool flag=0;
for(int i=2*x;i<=len-x;i++){
if(Next[i]>=x){//如果Next数组的值大于或等于x就成立,因为next数组代表的是与前面的匹配程度嘛,利用它的性质做题很有必要
flag=1;break;//为什么从2*x开始是因为当前面的串是这样的时候,aaaaabaaa;x=3;这时Next数组的4已经等于3了,但是不满足
}
}
if(flag) return 1;
else return 0;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%s",str1);
len=strlen(str1);
makenext(len);
int le=0,ri=350000;
int ans=0;
while(ri-le>1){
int mid=(le+ri)>>1;
if(judge(mid)) le=mid,ans=mid;
else ri=mid;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM HDU 数据结构 KMP 二分