社区讨论
43pts 求救
P5410【模板】扩展 KMP / exKMP(Z 函数)参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo86im4x
- 此快照首次捕获于
- 2023/10/27 13:34 2 年前
- 此快照最后确认于
- 2023/10/27 13:34 2 年前
RT.
全部都是在第二问上挂的。
快调郁闷了。
全部都是在第二问上挂的。
快调郁闷了。
个关注。
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 条回复,欢迎继续交流。
正在加载回复...