LA - 3026 - Period(KMP)

来源:互联网 发布:广州网络咨询招聘 编辑:程序博客网 时间:2024/05/16 02:52

题意:求一个字符串每个前缀的最短循环节,输出前缀i的长度和循环节的长度。

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=13&page=show_problem&problem=1027

——>>第一道KMP题目……照汝佳的书敲下……

#include <cstdio>using namespace std;const int maxn = 1000000 + 10;char P[maxn];int f[maxn];int main(){    int n, kase = 0;    while(scanf("%d", &n) == 1 && n)    {        scanf("%s", P);        f[0] = 0;        f[1] = 0;        for(int i = 1; i < n; i++)        {            int j = f[i];            while(j && P[i] != P[j]) j = f[j];            f[i+1] = (P[i] == P[j] ? j+1 : 0);        }        printf("Test case #%d\n", ++kase);        for(int i = 2; i <= n; i++)            if(f[i] > 0 && i % (i-f[i]) == 0) printf("%d %d\n", i, i/(i-f[i]));        printf("\n");    }    return 0;}


原创粉丝点击