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; }