Power Strings (KMP求最小循环节)
Posted willendless
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Power Strings (KMP求最小循环节)相关的知识,希望对你有一定的参考价值。
# 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-nxt[n]));
else puts("1");
}
return 0;
}
以上是关于Power Strings (KMP求最小循环节)的主要内容,如果未能解决你的问题,请参考以下文章
kmp+最小循环节poj 2406 Power Strings
ZOJ1905Power Strings (KMP||后缀数组+RMQ求循环节)