2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=2e5+10,base=13331; char s1[N],s2[N]; int h[2][N],d[N]; int ans[N]; int hashA(int l,int r){return h[0][r]-h[0][l-1]*d[r-l+1];} int hashB(int l,int r){return h[1][r]-h[1][l-1]*d[r-l+1];} int main() { int n,m,q;scanf("%d%d%d",&n,&m,&q); scanf("%s",s1+1); scanf("%s",s2+1); int nm=max(n,m); d[0]=1;for(int i=1;i<=nm;i++)d[i]=d[i-1]*base; for(int i=1;i<=n;i++)h[0][i]=h[0][i-1]*base+s1[i]-'a'; for(int i=1;i<=m;i++)h[1][i]=h[1][i-1]*base+s2[i]-'a'; for(int i=1;i<=n;i++) { int l=i,r=min(i+m-1,n),mid,t=0; while(l<=r) { mid=l+r>>1; if(hashA(i,mid)!=hashB(1,mid-i+1))r=mid-1; else t=mid-i+1,l=mid+1; } ans[t]++; } while(q--) { int x;scanf("%d",&x); printf("%d\n",ans[x]); } return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=2e5+10,base=13331; char s1[N],s2[N]; int h[2][N],d[N]; int ans[N]; int hashA(int l,int r){return h[0][r]-h[0][l-1]*d[r-l+1];} int hashB(int l,int r){return h[1][r]-h[1][l-1]*d[r-l+1];} int main() { int n,m,q;scanf("%d%d%d",&n,&m,&q); scanf("%s",s1+1); scanf("%s",s2+1); int nm=max(n,m); d[0]=1;for(int i=1;i<=nm;i++)d[i]=d[i-1]*base; for(int i=1;i<=n;i++)h[0][i]=h[0][i-1]*base+s1[i]-'a'; for(int i=1;i<=m;i++)h[1][i]=h[1][i-1]*base+s2[i]-'a'; for(int i=1;i<=n;i++) { int l=i,r=min(i+m-1,n),mid,t=0; while(l<=r) { mid=l+r>>1; if(hashA(i,mid)!=hashB(1,mid-i+1))r=mid-1; else t=mid-i+1,l=mid+1; } ans[t]++; } while(q--) { int x;scanf("%d",&x); printf("%d\n",ans[x]); } return 0; }
- 1
信息
- ID
- 1507
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 5
- 标签
- 递交数
- 73
- 已通过
- 30
- 上传者