社区讨论
70分,但是开long long了
P3501[POI 2010] ANT-Antisymmetry参与者 2已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lp9jlh52
- 此快照首次捕获于
- 2023/11/22 17:08 2 年前
- 此快照最后确认于
- 2023/11/22 19:25 2 年前
C
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
char g1[500010],g2[500010];
int n,jc[500010],h1[500010],p=131,l,r,s,h2[500010],ans;
inline int read()
{
int k=0,f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
return f?-k:k;
}
inline int get1(int l,int r)
{
return h1[r]-h1[l-1]*jc[r-l+1];
}
inline int get2(int l,int r)
{
return h2[r]-h2[l-1]*jc[r-l+1];
}
inline int check(int len,int k)
{
if(k-len+1<=0||k+len>n) return 0;
if(get1(k-len+1,k)==get2(n-k-len+1,n-k)) return 1;
return 0;
}
signed main()
{
n=read();
scanf("%s",g1+1);
for(int i=1;i<=n;i++) g1[i]-='0';
for(int i=1;i<=n;i++) g2[i]=1-g1[n-i+1];
jc[0]=1;
for(int i=1;i<=n;i++)
{
jc[i]=jc[i-1]*p;
h1[i]=h1[i-1]*p+g1[i];
h2[i]=h2[i-1]*p+g2[i];
}
for(int i=1;i<=n;i++)
{
l=1,r=n,ans=0;
while(l<=r)
{
int m=(l+r)>>1;
if(check(m,i))
{
ans=m;
l=m+1;
}
else r=m-1;
}
s+=ans;
}
std::cout<<s;
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...