爆0求助
查看原帖
爆0求助
220824
yyz1005楼主2022/7/5 21:34

KMP+马拉车

#include<bits/stdc++.h>
using namespace std;
string s,c;
string s2;
vector<int> km;
int lm[400010],rm[400010];
int next[400010];
int p[400010],n,mx = 0,id = 0;
long long a[400010];
long long sigf[4000010];
long long sigs[4000010];
const long long Mo = 4294967296ll;
void KMP(){
	int v1 = -1;
	next[0] = -1;
	for(int i = 0; i < s2.length(); ){
		if(v1==-1||s2[i]==s2[v1]){
			i++,v1++;
			next[i] = v1;
		} else v1 = next[v1];
	}
	v1 = 0;
	for(int i = 0; i < s.length(); ){
		if(v1==-1||s[i]==s2[v1]) i++,v1++;
		else v1 = next[v1];
		if(v1==s2.length()){
			a[i-s2.length()] = 1;
			km.push_back(i-s2.length()+1);
			v1 = next[v1];
		}
	}
}
int r[4000010],pos = 0;
int mein,meik;
int main(){
	cin >> mein >> meik;
	cin >> s >> s2;
	KMP();
	n = s.length();
	c.push_back('!');
	for(int i = 1; i <= n; i++){
		c.push_back('$');
		c.push_back(s[i-1]);
	}
	c.push_back('$');
	c.push_back('@');
	c.push_back('0');
	for(int i = 1; i <= 2*n+3; i++){
		p[i] = (mx>i?min(p[2*id-i],mx-i):1);
		while(i-p[i]>=1&&i+p[i]<=2*n+3&&c.at(i-p[i])==c.at(i+p[i])){
			p[i]++;
		}
		if(i+p[i]>mx){
			mx = i+p[i];
			id = i;
		}
		if(c[i]<='z'&&c[i]>='a'){
			r[pos] = p[i]-1;
			pos++;
		}
	}
	sigf[0] = a[0],sigs[0] = a[0];
	for(int i = 1; i < s.length(); i++){
		sigf[i] = a[i]+sigf[i-1];
		sigs[i] = sigf[i]+sigs[i-1];
	}
	int ans = 0;
	for(int i = 0; i < s.length(); i++){
		int L = i-(r[i]-1)/2,R = i+(r[i]-1)/2-s2.length()+1;
		int dist = (R-L)/2;
		ans = ans+(sigs[R]-sigs[max(0,R-dist-1)]-sigs[max(0,L+dist-1)]+sigs[max(0,L-2)]);
		ans%=Mo;
	}
	printf("%d",ans);
	return 0;
}
2022/7/5 21:34
加载中...