poj-2406(kmp水题)
题意:定义一个a*b=字符串a连接字符串b;给你一个字符串s,问你这个字符串最多能用多少个字符串t连接得到;例如:aaaa=4个a构成;
解题思路:kmp水题,next数组除了查找字串以外最广泛的一种用法,用来判定一个串是不是循环串,如果是,输出原串的长度/最小的循环节,否则,输出1就行了;
代码:
#include<iostream> #include<cstdio> #include<cstring> #define maxn 1000500 using namespace std; int next[maxn]; char t[maxn]; int tlen; void get_next() { int j=0,k=-1;next[0]=-1; while(j<tlen) { if(k==-1||t[j]==t[k]) next[++j]=++k; else k=next[k]; } } int main() { while(gets(t)) { tlen=strlen(t); if(strcmp(t,".")==0) break; get_next(); int len=tlen-next[tlen]; if(tlen%len==0) { printf("%d\n",tlen/len); } else { printf("1\n"); } //printf("%d\n",ans); } }