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

POJ - 2406 Power Strings (KMP循环节)

时间:2014-09-13 09:23:34      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:des   style   io   os   ar   for   div   sp   on   

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;
}


POJ - 2406 Power Strings (KMP循环节)

标签:des   style   io   os   ar   for   div   sp   on   

原文地址:http://blog.csdn.net/u011345136/article/details/39249189

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