字符串哈希求条【1关】非板题
  • 板块学术版
  • 楼主xu_zhihao
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/14 11:52
  • 上次更新2024/7/14 14:14:15
查看原帖
字符串哈希求条【1关】非板题
1063855
xu_zhihao楼主2024/7/14 11:52
#include<bits/stdc++.h>
using namespace std;
const long long P=2e18+7;
long long Hash1[1000010];
long long Hash2[1000010];
long long base[1000010];
void Init(){
	base[0]=1;
	for(int i=1;i<=1e6;i++){
		base[i]=base[i-1]%P*26%P;
	}
}
int main(){
	Init();
	int n,m;
	scanf("%d%d",&n,&m);
	string s,t;
	cin>>s>>t;
	for(int i=n-1;i>=0;i--){
		if(i!=n-1){
			Hash1[n-i-1]=Hash1[n-i-2];
		}
		Hash1[n-i-1]+=(s[i]-'a'+1)%P*base[n-i-1]%P;
		//10 3cout<<Hash1[n-i-1]<<" ";
	}
	//cout<<endl;
	for(int i=m-1;i>=0;i--){
		if(i!=m-1){
			Hash2[m-i-1]=Hash2[m-i-2];
		}
		Hash2[m-i-1]+=(t[i]-'a'+1)*base[m-i-1];
		//cout<<Hash2[m-i-1]<<" ";
	}
	//12345
	int ret=0;
	for(int i=m-1;i<n;i++){
		long long ans=Hash1[i];
		if(ans!=m-1){
			ans-=Hash1[i-m];
			ans=ans/base[i-m+1];
		}
		//cout<<ans<<endl;
		cout<<ans<<endl;
		if(ans==Hash2[m-1]){
			ret++;
			i+=m-1;
		}
	}
	printf("%d",ret);
} 
2024/7/14 11:52
加载中...