Periodic Strings Uva455 【KMP】


A character string is said to have period k if it can be formed by concatenating one or more repetitions of another string of length k. For example, the string "abcabcabcabc" has period 3, since it is formed by 4 repetitions of the string "abc". It also has periods 6 (two repetitions of "abcabc") and 12 (one repetition of "abcabcabcabc").

Write a program to read a character string and determine its smallest period.

Input

The first line oif the input file will contain a single integer N indicating how many test case that your program will test followed by a blank line. Each test case will contain a single character string of up to 80 non-blank characters. Two consecutive input will separated by a blank line.

Output

An integer denoting the smallest period of the input string for each input. Two consecutive output are separated by a blank line.

Sample Input

1

HoHoHo

Sample Output

2
 
 
 
 
//KMP
#include <stdio.h>
#include <string.h>
#define MAXN 10010
int next[MAXN];
char str[MAXN];
int len;
void GetNext()
{
	int i=0,j=-1;
	next[0]=-1;
	while(i<len)
	{
		if(j==-1 || str[i]==str[j])
		{
			++i,++j;
			next[i]=j;
		}
		else j=next[j];
	}
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",str);
		len=strlen(str);
		GetNext();
		if(len%(len-next[len])==0 && next[len]!=0)
		{
			printf("%d\n",len-next[len]);
		}
		else printf("%d\n",len);
		if(T) puts("");
	}
	return 0;
}


//暴力
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char str[104];
int main()
{
	int n;
	scanf("%d",&n);
	while (n --) {
		scanf("%s",str);
		int len = strlen(str); 
		for (int k,i = 1 ; i <= len ; ++ i)
			if (len%i == 0) {
				for (k = i ; k < len ; ++ k)
					if (str[k] != str[k%i])
						break;
				if (k == len) {
					printf("%d\n",i);
					break;
				}
		}
		if (n) printf("\n");
	}
	return 0;
}


你可能感兴趣的:(Periodic Strings Uva455 【KMP】)