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.
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.
An integer denoting the smallest period of the input string for each input. Two consecutive output are separated by a blank line.
1 HoHoHo
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; }