社区讨论

WA22pts球跳

P5410【模板】扩展 KMP / exKMP(Z 函数)参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mk9qhpj4
此快照首次捕获于
2026/01/11 20:52
2 个月前
此快照最后确认于
2026/01/15 23:55
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e7+5;
using ll=long long;
char a[N],b[N];
int na,nb,r,l;
ll z[N],p[N],ans;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>(a);cin>>(b);
	na=strlen(a),nb=strlen(b);
	z[0]=nb;l=1;r=0;
	while(r+1<nb&&b[r]==b[1+r]) r++;
	z[1]=r;
	for(int i=2;i<nb;i++){
		if(i+z[i-l]<=r) z[i]=z[i-l];
		else{
			z[i]=max(0ll,r-ll(i)+1);
			while(b[z[i]+i]==b[z[i]]&&z[i]+i<nb) z[i]++;
			l=i;r=l+z[l]-1;
		}
	}
	for(int i=0;i<nb;i++) ans^=((i+1)*(z[i]+1));
	cout<<ans<<'\n';ans=0;
	l=r=0;
	while(r<na&&r<nb&&a[r]==b[r]) r++;
	p[0]=r;
	for(int i=1;i<na;i++){
		if(i+z[i-l]<=r) p[i]=z[i-l];
		else{
			p[i]=max(0ll,r-ll(i)+1);
			while(p[i]+i<na&&p[i]<nb&&a[p[i]+i]==b[p[i]]) p[i]++;
			l=i;r=l+p[l]-1;
		}
	}
	for(int i=0;i<na;i++) ans^=((i+1)*(p[i]+1));
	cout<<ans;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...