zoukankan      html  css  js  c++  java
  • 【BZOJ1511】[POI2006]OKR-Periods of Words next数组

    【BZOJ1511】[POI2006]OKR-Periods of Words

    Description

    一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A的一个proper前缀. 定义Q 是A的周期, 当且仅当Q是A的一个proper 前缀并且A是QQ的前缀(不一定要是proper前缀). 比如串 abab 和 ababab 都是串abababa的周期. 串A的最大周期就是它最长的一个周期或者是一个空串(当A没有周期的时候), 比如说, ababab的最大周期是abab. 串abc的最大周期是空串. 给出一个串,求出它所有前缀的最大周期长度之和.

    Input

    第一行一个整数 k ( 1 k 1 000 000) 表示串的长度. 接下来一行表示给出的串.

    Output

    输出一个整数表示它所有前缀的最大周期长度之和.

    Sample Input

    8
    babababa

    Sample Output

    24

    题解:这个我们可以先画一画

    我们易知一个前缀i可以由两个next[i]组成,例如:

    abababa next[7]=5,所以abababa可以由两个ababa组成

    同理ababa可以由aba组成

    aba可以由a组成

    a的next=0,所以结束

    因此,a一定既是abababa的前缀,又是它的后缀,并且是最小的

    所以剩余部分ababab+ababab一定符合要求,答案为ababab

    具体做法,维护一个数组cnt[i]代表i取若干次next后的值就行了

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    int n;
    int next[1000010],cnt[1000010];
    char str[1000010];
    long long ans;
    int main()
    {
    	scanf("%d%s",&n,str);
    	int i=0,j=-1;
    	next[0]=-1;
    	while(i<n)
    	{
    		if(j==-1||str[i]==str[j])	next[++i]=++j,cnt[i]=(j>0)?cnt[j]:i;
    		else	j=next[j];
    	}
    	for(i=1;i<=n;i++)	ans+=i-cnt[i];
    	printf("%lld",ans);
    	return 0;
    }
  • 相关阅读:
    [Java基础] 深入jar包:从jar包中读取资源文件
    [Git] git merge和rebase的区别
    windows和linux中换行符的转换
    使用 scikit-learn 实现多类别及多标签分类算法
    python 特征缺失值填充
    多输出回归问题
    python DataFrame获取行数、列数、索引及第几行第几列的值
    Xgboost 模型保存和载入()
    pandas所占内存释放
    SSE,MSE,RMSE,R-square 指标讲解
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6825427.html
Copyright © 2011-2022 走看看