您的位置:首页 > 其它

POJ - 2406 Power Strings (KMP循环节)

2014-09-13 09:17 351 查看
Description

Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined
in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

Input

Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a^n for some string a.

Sample Input

abcd
aaaa
ababab
.


Sample Output

1
4
3

题意:题目要求的是给定一个字符串找到最小循环节的个数,但是这里有个限制的地方就是如果这个字符串不是刚好由n个
最小循环节组成那么就认为一整串才是一个循环节
思路:KMP应用
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000010;

char pattern[maxn];
int next[maxn];

void getNext() {
	int m = strlen(pattern);
	next[0] = next[1] = 0;
	for (int i = 1; i < m; i++) {
		int j = next[i];
		while (j && pattern[i] != pattern[j])
			j = next[j];
		next[i+1] = pattern[i] == pattern[j] ? j+1 : 0;
	}

	int len = m - next[m];
	if (m % len == 0)
		printf("%d\n", m/len);
	else printf("1\n");
}

int main() {
	while (gets(pattern)) {
		if (strcmp(pattern, ".") == 0)
			break;
		getNext();
	}	
	return 0;
}


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