码迷,mamicode.com
首页 > 其他好文 > 详细

Power Strings (KMP求最小循环节)

时间:2018-09-08 16:50:19      阅读:600      评论:0      收藏:0      [点我收藏+]

标签:power   class   href   print   else   连接   算法   for   problem   

# 10035. 「一本通 2.1 练习 1」Power Strings

【题目描述】

给定若干个长度 $\le 10^6$?? 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab 则最多有 333 个 ab 连接而成。

【算法】

1、kmp第一步求出字符串的特征向量。若n%(n-nxt[n])==0&&nxt[n](n是字符串长度)则循环节个数为n/(n-nxt[n])
2、也可以用字符串hash,枚举循环节长度 $l$ + $O(1)$ 判定。

【代码】

#include <bits/stdc++.h>
using namespace std;
int nxt[1000100];
char s[1000100];
int main() {
    while(~scanf("%s",s+1)&&s[1]!='.') {
        int n=strlen(s+1);
        nxt[1]=0;
        for(int i=2,j=0;i<=n;i++) {
            while(j>0&&(j==n||s[i]!=s[j+1])) j=nxt[j];
            if(s[i]==s[j+1]) j++;
            nxt[i]=j;
        }
        if(n%(n-nxt[n])==0&&nxt[n]) printf("%d\n",n/(n-nxt[n]));
        else puts("1");
    }
    return 0;
}

Power Strings (KMP求最小循环节)

标签:power   class   href   print   else   连接   算法   for   problem   

原文地址:https://www.cnblogs.com/Willendless/p/9609445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!