zoukankan      html  css  js  c++  java
  • P3435 [POI2006]OKR-Periods of Words KMP算法扩展

    题意:

    对于一个仅含小写字母的字符串(q,p)(a) 的前缀且 (a e p),那么我们称 (p)(a) 的 proper 前缀。

    规定字符串 (Q)(可以是空串)表示 (a) 的周期,当且仅当 (Q)(a) 的 proper 前缀且 (a)(Q+Q)的前缀。

    例如 ababab 的一个周期,因为 ababab 的 proper 前缀,且 ababab+ab 的前缀。

    求给定字符串所有前缀的最大周期长度之和。

    范围&性质:(1le kle 10^6)

    分析:

    借用别人的图,侵删

    img

    这里利用了next数组的性质:(next[i])表示(i)的最长的前缀和后缀相同的长度

    如图可得对于字符串(i),令(j=i),然后在(j>0)的情况下令(j=next[j])最大周期就是(i-j)

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    namespace zzc
    {
    	const int maxn = 1e6+5;
    	int n;
    	long long ans;
    	char ch[maxn];
    	int nxt[maxn];
    	
    	void work()
    	{
    		scanf("%d",&n);
    		scanf("%s",ch+1);
    		for(int i=2,j=0;i<=n;i++)
    		{
    			while(j&&ch[i]!=ch[j+1]) j=nxt[j];
    			if(ch[i]==ch[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);
    	}
    	
    }
    
    int main()
    {
    	zzc::work();
    	return 0;
    }
    
  • 相关阅读:
    java 多线程 继承Thread和实现Runnable的区别
    TCP和UDP的区别
    重载与覆盖(java)
    感悟
    ant design + react带有二级导航菜单自动生成
    自己搭建ant design框架
    ant design框架学习
    radio美化
    nodejs-微信公众号 ----答疑机器人
    微信小程序----开发小技巧(二)
  • 原文地址:https://www.cnblogs.com/youth518/p/13679775.html
Copyright © 2011-2022 走看看