zoukankan      html  css  js  c++  java
  • UVa1328

    题目大意

    给定一个长度为n的字符串,求它的每个前缀的最短循环节

    题解

    白书例题~~~

    ”错位部分“长度为i-f[i],

    {NSIZPH8WE}7_)8EV{~~MOG

    如果这个前i个字符能够组成一个周期串,那么”错位”部分刚好是一个循环节i-f[i]就是循环节长度~~~~

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define  MAXN 1000005
    int f[MAXN];
    char p[MAXN];
    int main()
    {
        int n,j,cases=1;
        while(scanf("%d",&n)!=EOF&&n)
        {
            printf("Test case #%d
    ",cases++);
            scanf("%s",p);
            int len=strlen(p);
            f[0]=j=-1;
            for(int i=1;i<len;i++)
            {
                while(j>=0&&p[j+1]!=p[i]) j=f[j];
                if(p[j+1]==p[i]) j++;
                f[i]=j;
            }
            for(int i=1;i<len;i++)
                if(f[i]>=0&&((i+1)%(i-f[i])==0))
                    printf("%d %d
    ",i+1,(i+1)/(i-f[i]));
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    课堂练习四
    手头软件产品的评价
    学习进度条十
    典型用户和用户场景描述
    学习进度条九
    学习进度条八
    冲刺第十天
    冲刺第九天
    冲刺第八天
    冲刺第七天
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3323861.html
Copyright © 2011-2022 走看看