给出一些字符串,求每个字符串中其所有子串最多出现的次数。
利用KMP的next数组求最小循环节。
如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std ;
const int maxn = 1e6+10 ;
char tar[maxn] ;
int n, m, nxt[maxn] ;
int main() {
int i, j, k ;
while ( scanf ( "%s", tar+1 ) != EOF ) {
if ( tar[1] == '.' ) return 0 ;
memset ( nxt, 0, sizeof(nxt) ) ;
n = strlen(tar+1) ;
for ( i = 2, j = 0 ; i <= n ; i ++ ) {
for ( ; j && tar[j+1] != tar[i] ; j = nxt[j] ) ;
if ( tar[j+1] == tar[i] ) ++ j ;
nxt[i] = j ;
}
int ans = 1 ;
if ( n%(n-nxt[n]) == 0 ) ans = n/(n-nxt[n]) ;
printf ( "%d\n", ans ) ;
}
return 0 ;
}