zoukankan      html  css  js  c++  java
  • BZOJ 1511: [POI2006]OKR-Periods of Words

    题目描述

    /*
    问题即求某一前缀A=XYZX的最小X的长度,可根据KMP中的nxt求出 
    但直接做会超时 
    考虑已经求过的某一串A是另一个串B的前缀,那么在求B的对答案的贡献时会重复一次求A的过程 
    所以可以在求完A之后更新A的nxt为求出X的位置,这样求B时就会直接跳到X的位置 
    */
    #include<complex>
    #include<cstdio>
    using namespace std;
    const int N=1e6+7;
    int n;
    long long ans;
    int nxt[N];
    char s[N];
    int main()
    {
        scanf("%d%s",&n,s+1);
        int j=0;
        for(int i=2;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=1;i<=n;i++)
        {
            int j=i;
            while(nxt[j])j=nxt[j];
            if(nxt[i])nxt[i]=j;
            ans+=i-j;
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    2
    vue学习03
    vue学习02
    2
    vue学习01
    pycharm中安装vue
    git
    form
    ajax
    中间件
  • 原文地址:https://www.cnblogs.com/LeTri/p/9880063.html
Copyright © 2011-2022 走看看