http://poj.org/problem?id=2406
题意:字符串A分解为数个相同的字符串B,求B的最多的个数,如ababab,可由3个ab组成,abcabab由1个abcabab组成(即本身),
aaaa由4个a组成。
解题:本题并不要用到KMP的整个算法,而只是用到了KMP算法中的:next[i]的值。所于要对next[i]比较理解。
以str="abcaababc"为例:
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
串 |
a |
b |
c |
a |
a |
b |
a |
b |
c |
next[i] |
-1 |
0 |
0 |
0 |
1 |
1 |
2 |
1 |
2 |
最后结果为ans=next[n]/(n-next[n])+1;n为字符串长度,如上面的"abcaababc",next[n]为next[9]=0,即next[]值我们要多算一位。
Source Code
Problem: 2406 | User: 541780774 | |
Memory: 5592K | Time: 157MS | |
Language: G++ | Result: Accepted |
Source Code
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
char str[1000000];
int next[1000000],n;
void get_next()//求模式串的“next[]”值
{
long i=0,j=-1;
next[0]=-1;
while(i<=n)
{
if(j==-1||str[i]==str[j])
next[++i]=++j;
else j=next[j];
}
}
main()
{
long i,ans;
while(gets(str))
{
if(strcmp(str,".")==0) break;
n=strlen(str);
get_next();
for(i=n;i>=0;i--)
if(next[i]!=next[i-1]+1||next[i]==1)
break;
if(next[n]%(n-next[n])==0)
ans=next[n]/(n-next[n])+1;
else
ans=1;
printf("%ld\n",ans);
}
system("pause");
}