社区讨论
萌新刚学OI,0pts请求DEBUG
P3501[POI 2010] ANT-Antisymmetry参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m01pgvpr
- 此快照首次捕获于
- 2024/08/20 08:47 2 年前
- 此快照最后确认于
- 2024/08/20 11:16 2 年前
CPP
#include<bits/stdc++.h>
#define MAXN 500005
#define HASH1 31
#define HASH2 29
#define MOD 19260817
#define ADD 131
using namespace std;
typedef unsigned long long ull;
int len;
char s[MAXN];
ull base1[MAXN],pre1[MAXN],suf1[MAXN];
ull base2[MAXN],pre2[MAXN],suf2[MAXN];
inline ull get_pre1(int l,int r){
return ((pre1[r]-pre1[l-1]*base1[r-l+1])%MOD+MOD)%MOD;
}
inline ull get_suf1(int l,int r){
return ((suf1[l]-suf1[r+1]*base1[r-l+1])%MOD+MOD)%MOD;
}
inline ull get_pre2(int l,int r){
return ((pre2[r]-pre2[l-1]*base2[r-l+1])%MOD+MOD)%MOD;
}
inline ull get_suf2(int l,int r){
return ((suf2[l]-suf2[r+1]*base2[r-l+1])%MOD+MOD)%MOD;
}
int main(){
scanf("%d %s",&len,s+1);
base1[0]=base2[0]=1;
for(int i=1;i<=len;++i){
base1[i]=(base1[i-1]*HASH1)%MOD;
base2[i]=(base2[i-1]*HASH2)%MOD;
pre1[i]=(pre1[i-1]*HASH1+(s[i]-'0'+ADD))%MOD;
pre2[i]=(pre2[i-1]*HASH2+(s[i]-'0'+ADD))%MOD;
}
for(int i=len;i>=1;--i){
suf1[i]=(suf1[i+1]*HASH1+('1'-s[i]+ADD))%MOD;
suf2[i]=(suf2[i+1]*HASH2+('1'-s[i]+ADD))%MOD;
}
ull ans=0;
for(int i=1;i<len;++i){
int l=0,r=min(i,len-i),res=0;
if(s[i]==s[i+1]){
continue;
}
while(l<=r){
int mid=(l+r)>>1;
if(get_pre1(i-mid,i)==get_suf1(i+1,i+1+mid)&&get_pre2(i-mid,i)==get_suf2(i+1,i+1+mid)){
l=mid+1;
res=l;
}else{
r=mid-1;
}
}
ans+=res;
}
printf("%llu",ans);
return 0;
}
无模就是80pts,但是加上了玄学模数就寄了QwQ
回复
共 1 条回复,欢迎继续交流。
正在加载回复...