//poj 2752 Seek the Name, Seek the Fame 求子串前缀跟后缀一样的各种情况

#include<stdio.h>
#define M 1000010
char s[M],t[M];
int next[M],sum;
void getNext()//求next数组
{
int i,j;
next[0]=-1;
for(i=1,j=-1;s[i];i++){
while(j!=-1&&s[i]!=s[j+1])j=next[j];//从s[j+1]开始找与s[i]相同的字母
if(s[j+1]==s[i])j++;
next[i]=j;//如果找到相同字母,next[i]记录此位置,否则next[i]=next[i-1]
}
}
void kmp()
{
int i,j;
sum=0;
getNext();
for(i=0,j=-1;t[i];i++){
while(j!=-1&&s[j+1]!=t[i])j=next[j];//按next[j]后退找出与t[i]相同的s[j+1]
if(s[j+1]==t[i])j++;//如果找到则向后前进
if(!s[j+1]){//如果在t中找到完整的s
sum++;//计数增1
j=next[j];//按next后退
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%s%s",s,t);
kmp();
printf("%d\n",sum);
}
return 0;
}
//poj 2752 Seek the Name, Seek the Fame 求子串前缀跟后缀一样的各种情况
#include<stdio.h>
#include<string.h>
#define M 400010
int j,n,res[M],next[M];
char s[M];
void getNext()
{
int i=1;
next[0]=-1;
for(j=-1;s[i];i++){
while(j!=-1&&s[j+1]!=s[i])j=next[j];
if(s[j+1]==s[i])j++;
next[i]=j;
}
n=i;
}
int main()
{
int i,num;
while(~scanf("%s",s)){
getNext();
j=n-1;
num=0;
while(j!=-1){
res[++num]=j+1;
j=next[j];
}
for(i=num;i>0;i--)printf("%d ",res[i]);
puts("");
}
return 0;
}
//poj 2406 Power Strings求子串在主串中最多叠加次数
#include<stdio.h>
#define M 1000010
int n,next[M];
char s[M];
void getNext()
{
int i=1,j=-1;
next[0]=-1;
for(;s[i];i++){
while(j!=-1&&s[j+1]!=s[i])j=next[j];
if(s[j+1]==s[i])j++;
next[i]=j;
}
n=i;
}
int main()
{
while(scanf("%s",s),s[0]!='.'){
getNext();
if(n%(n-next[n-1]-1))puts("1");
else printf("%d\n",n/(n-next[n-1]-1));
}
return 0;
}
//poj 1961 Period 跟上面一题几乎一样,把主串的每一种前缀当作小主串,如果小主串的子串在小主串中叠加次数大于1,输出小主串长度及叠加次数。
#include<stdio.h>
#define M 1000010
int i,n,next[M];
char s[M];
void getNext()
{
int j=-1;
next[0]=-1;
for(i=1;s[i];i++){
while(j!=-1&&s[j+1]!=s[i])j=next[j];
if(s[j+1]==s[i])j++;
next[i]=j;
}
}
int main()
{
int k=0;
while(scanf("%d",&n),n){
scanf("%s",s);
printf("Test case #%d\n",++k);
getNext();
for(i=1;i<=n;i++)
if(i%(i-next[i-1]-1)==0&&next[i-1]>-1)
printf("%d %d\n",i,i/(i-next[i-1]-1));
puts("");
}
return 0;
}

posted @ 2017-11-08 22:35  can丶  阅读(183)  评论(0编辑  收藏  举报