本文主要是介绍HDU 1358(kmp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:给出一个数字n,接下来一行是一个字符串,n是这个字符串的长度。求这个字符串的所有是循环字符串的前缀。
kmp中的next数组只得是第i个字符匹配错误,向前跳的位置next【i】。
#include<algorithm>
#include<stdio.h>
#include<string>
#include<string.h>
#include<math.h>
#include<queue>
#include<iostream>
using namespace std;
int i,j,k;
int len;
char s[1000001];
int next[1000001];
void get_next()
{
int i=0,j=-1;
next[0]=-1;
for(;s[i];)
if(j==-1||s[i]==s[j])
{
++i;++j;
next[i]=j;
}
else j=next[j];
}
int main(){
int t=1;
while(scanf("%d",&len)&&len){
getchar();
scanf("%s",s);
get_next();
printf("Test case #%d\n",t++);
for(i=2;i<=len;i++){
j=i-next[i];
if(i%j==0){
if(i/j>1) printf("%d %d\n",i,i/j);
}
}
printf("\n");
}
return 0;
}
这篇关于HDU 1358(kmp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!