您的位置:首页 > 其它

POJ 2406 Power Strings(KMP求最小循环节)

2015-08-14 16:20 357 查看
先简单介绍一下KMP算法利用 nxt 数组求最小循环节的原理:



假设图中的黑色是原来的字符串,现在要求最小循环节,对于nxt[len]来说指的是图中蓝色和黄色的长度,而且蓝色和黄色是相等的,

那么绿色和紫色也是相等的,,对比原串可知紫色跟粉色是相同的子串,那么绿色跟粉色相同,然后对比蓝色跟黄色可知红色跟粉色相同,对比原串,红色跟棕色相同,那么棕色跟粉色相同,不断重复此过程可知若此字符串有最小循环节,那么循环次数一定为len/(len-nxt[len])。

结论:如果len%(len-nxt[len])=0,那么循环次数为len/(len-nxt[len]),否则为1

#pragma warning(disable:4996)
#include <cstdio>
#include <cstring>
using namespace std;

char s[1000100];
int nxt[1000100];

void get_nxt(){
int len = strlen(s);
nxt[0] = -1;
int i = 0, j = -1;

while (i < len){
if (j == -1 || s[i] == s[j]){
i++, j++;
nxt[i] = j;
}
else j = nxt[j];
}
}

int main(){
//freopen("in.txt", "r", stdin);
while (scanf("%s", s)){
int len = strlen(s);
if (len == 1 && s[0] == '.')break;

get_nxt();

int ans = len % (len - nxt[len]) == 0 ? len / (len - nxt[len]) : 1;
printf("%d\n", ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: