HDU 4763 数据结构之KMP+二分

点击打开链接

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

思路:用KMP的next数组,然后用二分求最大值,具体看二分就行了

#include 
#include 
#include 
#include 
#include 
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=(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;
}

你可能感兴趣的:(数据结构,KMP,二分,线段树)