hdu1358 Period(kmp周期)

题目链接:点击打开链接

题意描述:给一个字符串,求这个字符串中每个前缀自身是否有周期性?

解题思路:kmp即可

代码:

#include <cstdio>
#include <cstring>
#define MAXN 1000010
using namespace std;
void getNext(char* str,int len,int* next){
    int i,j;
    j=next[0]=-1;
    i=0;
    while(i<len){
        while(j!=-1&&str[i]!=str[j]) j=next[j];
        ++i,++j;
        next[i]=j;
    }
}
char st[MAXN];
int next[MAXN];
int main(){
    int t=0,n;
    while(++t){
        scanf("%d",&n);
        if(!n) break;
        scanf("%s",st);
        getNext(st,n,next);
        printf("Test case #%d\n",t);
        for(int i=2;i<=n;i++){
            if((i%(i-next[i])==0)&&(i/(i-next[i])>1))
                printf("%d %d\n",i,i/(i-next[i]));
        }
        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 07:31:31

hdu1358 Period(kmp周期)的相关文章

LA3026 - Period(KMP)

For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 ≤ i ≤ N) we want to know the largest K > 1 (if the

uva 1328 - Period (周期串的判断 kmp)

题意:给一个长为n的字符串,问字符串的前缀是不是周期串,如果是周期串,输出前缀的最后一个字母的位置和最短周期 思路:kmp字符串匹配的性质运用. 对于前i个字符,如果f[i]不等于零,说明在此字符串的前缀中,有一部分[0,f[i]]和本字符串[i-f[i],i]的这一部分是相同的.如果这i个字符组成一个周期串,那么错开的一部分[f[i],i]恰好是一个循环节.(换句话说,如果满足f[i]不等于零 && [f[i],i]是循环节这两点,就可以说明前i个字符组成一个周期串) code: #in

hdu-1358 Period 【kmp】

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3443    Accepted Submission(s): 1727 Problem Description For each prefix of a given string S with N characters (each character has an ASCI

[KMP]HDU1358 Period

题目链接 思考 题目就是利用KMP的失配数组来找循环串.具体看代码注释 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int nexta[1000002]; char s[1000002]; int n; //失配数组 void getnexta() { memset(nexta,0,sizeof(nexta)); int k = -1,j = 0; nexta

HDU1358 Period【KMP】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目大意: 给你长度为N的字符串s,求字符串s的循环前缀的长度和循环的次数. 例如:长度为8的字符串:"abababab" 长度为4的前缀"abab",循环前缀为"ab",循环2次 长度为6的前缀"ababab",循环前缀为"ab",循环3次 长度为8的前缀"abababab",循环

HDU-1358 Period 字符串问题 KMP算法 求最小循环节

题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提交过程 TLE maxn没给够 AC 代码 #include <cstring> #include <cstdio> const int maxm=1e6+20; char P[maxm]; int fail[maxm]; void getFail(int m){ fail[0]=fa

poj1961 Period kmp解决找字符串的最小循环节

/** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个),输出前缀字符串长度以及最大的循环周期: 思路: 参考自:http://www.cnblogs.com/chenxiwenruo/p/3546457.html 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0-len-next[len]-1]. (1)

hdu oj Period (kmp的应用)

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2866    Accepted Submission(s): 1433 Problem Description For each prefix of a given string S with N characters (each character has an ASCI

hdu 1358 period KMP入门

Period 题意:一个长为N (2 <= N <= 1 000 000) 的字符串,问前缀串长度为k(k > 1)是否是一个周期串,即k = A...A;若是则按k从小到大的顺序输出k即周期数: Sample Input 3 aaa 12 aabaabaabaab 0 Sample Output Test case #1 2 2 3 3 Test case #2 2   2 6   2 9   3 12  4 题目其实是来自于LA的..挺好的一道题,用的是原版的kmp.. 写写对KMP