我用哈希+二分 task1,2 没过 求助
查看原帖
我用哈希+二分 task1,2 没过 求助
655579
Peizekai楼主2024/5/21 18:06
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,P=10003,p=233;
string s1,s2;
int n,m,a[N],b[N],c[N];
int f(int k){
	int l=0,r=k-1;
	while(l<r){
		int mid=(l+r+1>>1);
		if(b[mid]!=(b[k]-b[k-mid]*c[mid]%P+P)%P) r=mid-1;
		else l=mid;
	}
	return l;
}
int main(){
	cin>>s1>>s2;
	n=s1.size(),m=s2.size();
	s1=' '+s1,s2=' '+s2;
	c[0]=1;
	for(int i=1;i<=m;i++) c[i]=c[i-1]*p%P;
	for(int i=1;i<=m;i++) b[i]=(b[i-1]*p+s2[i])%P;
	for(int i=1;i<=n;i++){
		a[i]=(a[i-1]*p+s1[i])%P;
		if(i>=m&&(a[i]-a[i-m]*c[m]%P+P)%P==b[m]) cout<<i-m+1<<'\n';
	}
	for(int i=1;i<=m;i++) cout<<f(i)<<' ';
	return 0;
}
2024/5/21 18:06
加载中...