社区讨论

本地测评没问题但上交re……

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mewi0318
此快照首次捕获于
2025/08/29 15:15
6 个月前
此快照最后确认于
2025/08/29 20:29
6 个月前
查看原帖
QwQ
CPP
#include<bits/stdc++.h>
using namespace std;
const int S=2e7+10;
long long la,lb,nxt[S],ext[S];
char a[S],b[S];
long long ans;
void add(char *x){
	int l=strlen(x),p=0,k=1;
	nxt[0]=l;
	while(p+1<l && x[p]==x[p+1]) p++;
	nxt[1]=p;
	for(int i=2;i<l;i++){
		p=k+nxt[k]-1;
		if(i+nxt[i-k]<=p) nxt[i]=nxt[i-k];
		else{
			int j=max(0,p-i+1);
			while(i+j<l && x[i+j]==x[j]) j++;
			nxt[i]=j,k=i;
		}
	}
}
int find(char *x,char *y){
	int lx=strlen(x),ly=strlen(y),p=0,k=1;
	while(p<lx && p<ly && x[p]==y[p]) p++;
	ext[0]=p;
	for(int i=1;i<lx;i++){
		p=k+ext[k]-1;
		if(i+nxt[i-k]<=p) ext[i]=nxt[i-k];
		else{
			int j=max(0,p-i+1);
			while(i+j<lx && j<ly && x[i+j]==y[j]) j++;
			ext[i]=j,k=i;
		}
	}
}
int main(){
	cin>>a>>b;
	la=strlen(a),lb=strlen(b);
	add(b);
	find(a,b);
	for(int i=0;i<lb;i++) ans^=(i+1)*(nxt[i]+1);
	printf("%lld\n",ans);
	ans=0;
	for(int i=0;i<la;i++) ans^=(i+1)*(ext[i]+1);
	printf("%lld",ans);
	return 0;
} 

回复

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

正在加载回复...