zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    搜刮一些开源项目的APP
    iOS Crash文件的解析
    iOS中RGB颜色转换
    随笔杂记
    iOS字体
    方法总结
    经验点滴
    个人理解
    OC 知识点回顾
    IOS UI 笔记整理回顾
  • 原文地址:https://www.cnblogs.com/ChrisKKK/p/11723881.html
Copyright © 2011-2022 走看看