给出一个字符串,求最多能将该串分成几个完整的某一个串。
如给出 ababab a b a b a b 那么最短的就是 ab a b ,答案就是3。
这道题可以用kmp做的,但是直接暴力也能过。
暴力:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 2e6+100;
int n,m;
char s[maxn];
void solve(){
int n = strlen(s);
int flag;
for(int i=1;i<=n;++i){
if(n%i != 0) continue;
flag = 1;
for(int j=0;j<n;++j){
if(s[j%i] != s[j]){
flag = 0;
break;
}
}
if(flag){
printf("%d\n", n/i);
break;
}
}
}
int main(int argc, char const *argv[])
{
while(scanf("%s",s)){
if(strcmp(s,".") == 0) break;
solve();
}
return 0;
}
kmp:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 2e6+100;
int n,m;
int next[maxn];
char s[maxn];
void getnext(){
m = strlen(s);
int i=0,j=-1;
next[0] = -1;
while(i<m){
if(j == -1 || s[i] == s[j]) next[++i] = ++j;
else j = next[j];
}
// for(int i=1;i<=m;++i) printf("%d ",next[i]);
// puts("");
}
int main(int argc, char const *argv[])
{
while(scanf("%s",s) && s[0] != '.'){
getnext();
int k = m-next[m];
if(m%k == 0) printf("%d\n", m/k);
else printf("1\n");
}
return 0;
}