zoukankan      html  css  js  c++  java
  • hdu 1358 Period

    题意:给定一个字符串,问这个字符串的所有前缀中,前缀最多重复的次数k,这个k需要大于1。

    KMP最小循环节、循环周期:

    定理:假设S的长度为len,则S存在最小循环节,
    循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。

    (1)如果len可以被len - next[len]整除,
    则表明字符串S可以完全由循环节循环组成,循环周期k=len/(len-next[len])。

     #include <string.h>
    #include <stdio.h>
    #include <math.h>
    #include <queue>
    #include <stack>
    #include <algorithm>
    #define ll long long
    using namespace std;
    const int maxn=1e6+10;
    char s[maxn];
    int nxt[maxn],n;
    void getnext()
    {
    	int i=0,j=-1;
    	nxt[0]=-1;
    	while(i<n)
    	{
    		if (j==-1||s[i]==s[j])
    		{
    			i++,j++;
    			nxt[i]=j;
    		}
    		else
    			j=nxt[j];
    	}
    }
    int main()
    {
    	int i,j;
    	int f=0;
    	while(~scanf("%d",&n)&&n)
    	{
    		f++;
    		scanf("%s",s);
    		getnext();
    		printf("Test case #%d
    ",f);
    		for (i=1; i<=n; i++)
    			if (i%(i-nxt[i])==0&&nxt[i]!=0)
    				printf("%d %d
    ",i,i/(i-nxt[i]));
    		printf("
    ");
    	}
    	return 0;
     }
  • 相关阅读:
    挺好的程序员面试网址
    [转]浅谈协方差矩阵
    坚持
    matlab中文论坛
    看书
    Opengl绘制点
    说服力
    心情
    vector操作
    我的毕设
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/14386831.html
Copyright © 2011-2022 走看看