社区讨论

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 条回复,欢迎继续交流。

正在加载回复...