题解:
一开始看下去好难啊,好像数据结构上的kmp串查找,然后发现原来串最大80;好吧又可以枚举了
每次枚举长度为j的串,一旦成功他就是最小的循环串
#include <cstdio> #include <iostream> #include <string> #include <cstring> #include <algorithm> #include <map> #include <cctype> using namespace std; int main() { //freopen("in.txt","r",stdin); //freopen("output.txt","w",stdout); int n; scanf("%d",&n); for(int i = 0; i < n; i++){ string str; cin >> str; if(i) printf("\n"); int len = str.size(); int minlen = 0; for(int j = 1;j <= len/2; j++){ if(len/j != len*1.0/j) continue; //如果不能平分就直接跳过 int ci = len/j; string sym = str.substr(0,j); //假设目标串 int pos = j; //匹配串的开始位置 int k; for(k = 1; k < ci; k++){ string tmp = str.substr(pos,j); if(tmp.compare(sym) != 0) break; pos += j; } if(k == ci){ minlen = j; break; } } if(!minlen) minlen = len; printf("%d\n",minlen); } return 0; }