【HDU 4763】Theme Section(KMP)

这题数据水的一B,直接暴力都可以过。

比赛的时候暴力过的,回头按照正法做了一发。

匹配的时候 失配函数 其实就是前缀 后缀的匹配长度,之后就是乱搞了。

KMP的题可能不会很直接的出,但是KMP的思想经常渗透在很多题目里面,最近需要多练习一下。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000005;
int _next[maxn],L;
char s[maxn];
void kmp_init(){
    int i,j;
    int m = strlen(s);
    j = _next[0] = -1;
    i = 0;
    while(i < m){
        while(j != -1 && s[i] != s[j]) j = _next[j];
        _next[++i] = ++j;
    }
}
bool kmp_solve(int len){
    int i,j,m = L - len;
    i = len;
    j = 0;
    while(i < m){
        while(j != -1 && s[j] != s[i]) j = _next[j];
        i++; j++;
        if(j >= len){
            return true;
        }
    }
    return false;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        L = strlen(s);
        kmp_init();
        int i = L - 1;
        int ans = 0;
        while(_next[i] >= 0){
            if(kmp_solve(_next[i] + 1)){
                ans = _next[i] + 1;
                break;
            }
            i = _next[i];
        }
        printf("%d\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值