题意:给你两个字符串p和s,求出p在s中出现的次数。
我先想直接把p接到s前面,之后求Next数组对strlen(p)取余==0的就可以,之后WA。最后发现A AASSAAS的时候有bug,只有又想到在p和s中间加个不可能出现的字符‘$‘就可以了,戒指就A了。
#include <bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; typedef long long ll; #define PI(A) printf("%d\n",A) #define SI(N) scanf("%d",&(N)) #define SII(N,M) scanf("%d%d",&(N),&(M)) #define cle(a,val) memset(a,(val),sizeof(a)) #define rep(i,b) for(int i=0;i<(b);i++) #define Rep(i,a,b) for(int i=(a);i<=(b);i++) #define reRep(i,a,b) for(int i=(a);i>=(b);i--) const double EPS= 1e-9 ; /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */ const int MAXN= 10000+ 1000000+9 ; void kmp_pre(int x[],int m,int Next[]) { int i,j; j=Next[0]=-1; i=0; while(i<m) { while(-1!=j&&x[i]!=x[j])j=Next[j]; Next[++i]=++j; } } int Next[MAXN],inp[MAXN]; int N,M; char str1[10000+5],str2[1000000+5]; int main() { int o; SI(o); while(o--) { scanf("%s",str1); scanf("%s",str2); N=strlen(str1),M=strlen(str2); str1[N]=‘$‘; N++; for (int i=0;i<N;i++) inp[i]=str1[i]; for (int i=N;i<N+M;i++) inp[i]=str2[i-N]; kmp_pre(inp,N+M,Next); int ans=0; Rep(i,1,N+M) if (Next[i]%(N-1)==0&&Next[i]!=0) ans++; PI(ans); } return 0; }
时间: 2024-10-12 15:18:31