求助
  • 板块灌水区
  • 楼主北射天狼
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/5/3 10:44
  • 上次更新2023/11/4 23:48:41
查看原帖
求助
289056
北射天狼楼主2021/5/3 10:44

题目

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int t,b=7;
char s[10001+10],c[1000001+10];
unsigned long long p[10001];
unsigned long long sum[100001];
unsigned long long ans=0,h=1<<31;
int main()
{
	for (int i=1;i<=100001;i++)
	    p[i]=p[i-1]*b;
	cin>>t;
	while (t--){
		ans=0;
		scanf("%s%s",s+1,c+1);
		int lenc=strlen(c+1);
		int lens=strlen(s+1);
		sum[0]=0;
		for (int i=1;i<=lenc;i++)  
		    sum[i]=(sum[i-1]*b+(unsigned long long)(c[i]-'A'+1))%h;
		unsigned long long a=0;
		for (int i=1;i<=lens;i++){
			a=(a*b+(unsigned long long)(s[i]-'A'+1))%h;
		}
		for(int i=0;i<=lenc-lens;i++)
             if(a==sum[i+lens]-sum[i]*p[lens]) ans++;
		
		cout<<ans<<endl;
	}
    return 0;
}

正解

#include<bits/stdc++.h>
using namespace std;

int T;
int n,m;
int ans;
char s1[10000+10],s2[1000000+10];
unsigned long long power[1000000+10];
unsigned long long H[1000000+10];
unsigned long long s,b=27,h=1<<31;


int main()
{
    power[0]=1;
    for(int i=1;i<=1000000;i++)
    power[i]=power[i-1]*b;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s%s",s1+1,s2+1);
        n=strlen(s1+1);m=strlen(s2+1);
        H[0]=0;
        for(int i=1;i<=m;i++) H[i]=(H[i-1]*b+(unsigned long long)(s2[i]-'A'+1))%h;
        s=0;
        for(int i=1;i<=n;i++) s=(s*b+(unsigned long long)(s1[i]-'A'+1))%h;
        ans=0;
        for(int i=0;i<=m-n;i++)
         if(s==H[i+n]-H[i]*power[n]) ans++;
        printf("%d\n",ans);
    }
    return 0;
}

错哪了?

2021/5/3 10:44
加载中...