zoukankan      html  css  js  c++  java
  • HDU 1358 Period(KMP计算周期)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358

    题目大意:给你一串字符串,判断字符串的前缀是否由某些字符串多次重复而构成。

    也就是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)

    的两次组成,也就是aa有两个a组成;

    第三行自然就是aabaab可有两个aab组成;

    第四行aabaabaab可由三个aab组成;

    第五行aabaabaabaab可由四个aab组成。

    解题思路:同HDU 3746类似,通过计算字符串前缀的循环节获得相应周期即可。

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 const int N=1e6+5;
     7 
     8 int m;
     9 int nxt[N];
    10 char p[N];
    11 
    12 void getnext(){
    13     int i,j;
    14     i=0,j=nxt[0]=-1;
    15     while(i<m){
    16         while(j!=-1&&p[i]!=p[j])
    17             j=nxt[j];
    18         nxt[++i]=++j;
    19     }
    20 }
    21 
    22 int main(){
    23     int cas=0;
    24     while(scanf("%d",&m)&&m){
    25         scanf("%s",p);
    26         getnext();
    27         printf("Test case #%d
    ",++cas);
    28         //枚举长度为2~m的字符串前缀
    29         for(int i=2;i<=m;i++){
    30             int mmin=i-nxt[i];          //len-nxt[len]为最小循环节
    31             if(i!=mmin&&i%mmin==0)
    32                 printf("%d %d
    ",i,i/mmin);
    33         }
    34         printf("
    ");
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    新·刷题记录【争取认真来做】
    Codeforces 235D Graph Game
    Codeforces 235B Let's Play Osu!
    Codeforces 235E Number Challenge
    Codeforces 235C Cyclical Quest
    AHOI2017游记
    bzoj4826: [Hnoi2017]影魔
    大数分解模板
    A new start
    0712
  • 原文地址:https://www.cnblogs.com/fu3638/p/8486483.html
Copyright © 2011-2022 走看看