社区讨论

43pts 求救

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lo86im4x
此快照首次捕获于
2023/10/27 13:34
2 年前
此快照最后确认于
2023/10/27 13:34
2 年前
查看原帖
RT.
全部都是在第二问上挂的。
快调郁闷了。
33 个关注。
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e7+5;
char a[maxn];
char b[maxn];
int z[maxn];
int p[maxn];
int len1,len2;
int max(int a,int b)
{
	return a>b?a:b;
}
int min(int a,int b)
{
	return a<b?a:b;
}
void answer1()
{
	int l=0,r=0;
	z[0]=len2;
	ll ans=len2+1;
//	printf("ans: %lld\n",ans);
	for(int i=1;i<len2;i++)
	{
	//	printf("l: %d r: %d\n",l,r);
	//	printf("(pre) z[%d]: %d]\n",i-l,z[i-l]);
		if(i<=r&&z[i-l]<r-i+1)
		{
			z[i]=z[i-l];
//			printf("(1) z[%d]: %d\n",i,z[i]);
		}
		else
		{
			z[i]=max(0,r-i+1);
      //   	printf("(sp) z[%d]: %d\n",i,z[i]); 
			while(b[i+z[i]]==b[z[i]]&&i+z[i]<len2)z[i]++;
//			printf("(2) z[%d]: %d\n",i,z[i]);
		}
		if(i+z[i]-1>r)
		{
			r=i+z[i]-1;
			l=i;
		}
		ans^=ll(i+1)*ll(z[i]+1);
	}
	printf("%lld\n",ans);
}
void answer2()
{
	ll ans=0;
	int l=0,r=0;
	while(a[p[0]]==b[p[0]])p[0]++;
	ans^=p[0]+1;
	for(int i=1;i<len1;i++)
	{
		if(i<=r&&p[i-l]<r-i+1)
		{
			p[i]=p[i-l];
		}
		else
		{
	//		printf("this\n");
			p[i]=max(0,r-i+1);
			while(a[i+p[i]]==b[p[i]]&&i+p[i]<len1&&p[i]<len2)p[i]++;
		}
		if(i+p[i]-1>r)
		{
			r=i+p[i]-1;
			l=i;
		}
		ans^=ll(i+1)*ll(p[i]+1);
//		printf("p[%d]: %d\n",i,p[i]);
	}
	printf("%lld",ans);
}
int main()
{
	scanf("%s",a);
	scanf("%s",b);
	len1=strlen(a);
	len2=strlen(b);
	answer1();
	answer2();
	return 0;
}  

回复

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

正在加载回复...