i?[0,size(s)?p?1] i ? [ 0 , s i z e ( s ) ? p ? 1 ] 满足 ..." />
当前位置: 代码迷 >> 综合 >> 【FZU 1901 Period II 】KMP
  详细解决方案

【FZU 1901 Period II 】KMP

热度:9   发布时间:2023-12-29 02:55:52.0

FZU1901
本题题意为求一个长度PP,使所有的

i ? [ 0 , s i z e ( s ) ? p ? 1 ]
满足

S[i]=S[i+P]S[i]=S[i+P]

本题考验next数组的理解运,在此重复一遍,kmp的next不断向前递归的过程可以保证对于每一个当前前缀,都有一段后缀与之对应,(对这里不太理解的,可以去看我的KMP专题博客),所以对于每一个next,我们都可以将他与最后的后缀对应作为一组答案。
FZU1901代码

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stack>
using namespace std ;
const int maxn = 1e6+5;
int Next[maxn];
char mo[maxn];
int n1,n2;
void GetNext()
{int i=0,j=-1;while(i<n2){if(j==-1||mo[i]==mo[j]) {++i,++j,Next[i]=j;}else j=Next[j];}return ;
}
int ans[maxn];
int main()
{int cnt=1;int t;scanf("%d",&t);while(t--){scanf("%s",mo);n2=strlen(mo);Next[0]=-1;int pp=0;GetNext();int tmp=Next[n2];while(tmp!=0){ans[pp++]=tmp;tmp=Next[tmp];}printf("Case #%d: %d\n",cnt++,pp+1);for(int i=0;i<pp;i++)printf("%d ",n2-ans[i]);printf("%d\n",n2);}return 0;
}
  相关解决方案