• Luogu_P3435 [POI2006]OKR-Periods of Words KMP


    Luogu_P3435 [POI2006]OKR-Periods of Words

    KMP


    题目链接
    阅读理解
    其实就是B是A的前缀
    那么叠加B成为BB,假如A是BB的前缀那么B就是合法
    问A的所有前缀的最大合法前缀的和
    emmm感性理解吧
    那么读懂题面也就可以解决了
    KMP的(nxt[])数组就是自我匹配的位置
    而且(nxt[])是可以递推,假如(nxt)都不为(0)
    (nxt[x])(nxt[nxt[x]])的末尾都是x这个数
    为了求最长,就让(nxt[i])最短,让(nxt[x]=nxt[nxt[x]])
    那么(i-nxt[i])就是最长的长度
    所有前缀求和就可以了


    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int n,nxt[1000010];
    long long ans;
    char s[1000010];
    int main()
    {
        cin>>n>>(s+1);
        for(int i=2,j=0;i<=n;i++){
            while(j && s[i]!=s[j+1]) j=nxt[j];
            if(s[i]==s[j+1]) j++;
            nxt[i]=j;
        }
        for(int i=2,j=2;i<=n;i++,j=i){
            while(nxt[j]) j=nxt[j];
            if(nxt[i]) nxt[i]=j;
            ans+=i-j;
        }
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    欧拉定理证明&阶乘的逆元
    Tree POJ
    GCD
    java42
    java41
    java
    java40
    搭建两个网站的琐碎问题
    虚拟机从无到有,服务器从无到有的历程(在更)
    java39
  • 原文地址:https://www.cnblogs.com/ChrisKKK/p/11723881.html
Copyright © 2020-2023  润新知