https://vjudge.net/contest/227956#problem/A
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int next[10000050];
char s[10000050];
void cal_next(int len,char a[])
{
next[0]=-1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀
int j=-1;//k初始化为-1
for(int i=1;i<len;i++)
{
while(j>-1&&a[i]!=a[j+1])//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的
{
j=next[j];//往前回溯
}
if(a[i]==a[j+1])//如果相同,j++
j=j+1;
next[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[q]
}
}
int main()
{
while(scanf("%s",s)&&s[0]!='.')
{
getchar();
int len=strlen(s);
//int ans=1;
cal_next(len,s);
// for(int i=0;i<len;i++)
// printf("%d ",next[i]);
if(len%(len-next[len-1]-1)==0)
printf("%d
",len/(len-next[len-1]-1));
else
printf("1
");
}
return 0;
}
https://vjudge.net/contest/227956#problem/B
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int next[10000050];
char s[10000050];
void cal_next(int len,char a[])
{
next[0]=-1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀
int j=-1;//k初始化为-1
for(int i=1;i<len;i++)
{
while(j>-1&&a[i]!=a[j+1])//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的
{
j=next[j];//往前回溯
}
if(a[i]==a[j+1])//如果相同,j++
j=j+1;
next[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[q]
}
}
int main()
{
while(scanf("%s",s)&&s[0]!='.')
{
getchar();
int len=strlen(s);
//int ans=1;
cal_next(len,s);
// for(int i=0;i<len;i++)
// printf("%d ",next[i]);
if(len%(len-next[len-1]-1)==0)
printf("%d
",len/(len-next[len-1]-1));
else
printf("1
");
}
return 0;
}
https://vjudge.net/contest/227956#problem/E
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char s[1000050],p[10050];
int next[10050];
void cal_next(char a[],int len)
{
next[0]=-1;
int k=-1;
for(int i=1;i<len;i++)
{
while(k>-1&&a[i]!=a[k+1])
k=next[k];
if(a[i]==a[k+1])
k++;
next[i]=k;
}
}
int kmp(char a[],int len1,char b[],int len2)
{
int k=-1,ans=0;
for(int i=0;i<len1;i++)
{
while(k>-1&&a[i]!=b[k+1])
k=next[k];
if(a[i]==b[k+1])
k++;
if(k==len2-1)
{
ans++;
k=next[k];
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
int ans=0;
scanf("%s",p);
getchar();
scanf("%s",s);
getchar();
int len1=strlen(p);
int len2=strlen(s);
cal_next(p,len1);
ans=kmp(s,len2,p,len1);
printf("%d
",ans);
}
return 0;
}