加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

The Preliminary Contest for ICPC Asia Xuzhou 2019 Colorful S

发布时间:2020-12-14 05:07:37 所属栏目:大数据 来源:网络整理
导读:? Colorful String ? 下午比赛TLE,一直很纳闷为什么线段树+回文树会T,然后晚上发现我线段树写错一行。然后气哭QAQ。 113m赛后过,不会T。 ? ? 下面代码用的是bitset,也可以直接状压,毕竟才26位。 线段树是记录[l,r]区间的状态,最后返回状态再得到1的数

?

Colorful String

?

下午比赛TLE,一直很纳闷为什么线段树+回文树会T,然后晚上发现我线段树写错一行。然后气哭QAQ。

113m赛后过,不会T。

?

?

下面代码用的是bitset,也可以直接状压,毕竟才26位。

线段树是记录[l,r]区间的状态,最后返回状态再得到1的数量。

?

回文树还是那个回文树。

?

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+50;
typedef long long ll;
/*******线段树***********/ 
struct P{
    int l,r;
    bitset<30>bit;
}tree[maxn<<2];
inline void build(int l,int r,int k)
{
    tree[k].l=l;tree[k].r=r;   
    if(tree[k].l==tree[k].r)return; 
    int mid=(tree[k].l+tree[k].r)>>1;
    build(l,mid,k<<1);
    build(mid+1,r,k<<1|1);
}
inline void add(int x,int u,int k)
{
    if(tree[k].l==tree[k].r)
    {
        tree[k].bit.set(u);return;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(x<=mid)add(x,u,k<<1);
    else add(x,k<<1|1);
    tree[k].bit=tree[k<<1].bit|tree[k<<1|1].bit;
}
inline bitset<30> find(int l,int k)
{
    if(tree[k].l==l&&tree[k].r==r)return tree[k].bit;
    if(tree[k].l==tree[k].r)
    {
        return tree[k].bit;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(r<=mid)return find(l,k<<1);
    if(l>mid)return find(l,k<<1|1);
    return find(l,k<<1)|find(mid+1,k<<1|1);
}
/***************************************/
char s[maxn];//存储主串 
ll ans1[maxn],cnt[maxn],ans;
int i,j,k,m,n,o,p,q,js,jl,tot,last;
int len[maxn],fail[maxn],ch[maxn][26];
inline int newnode(int x)
{
    tot++;
    len[tot]=x;
    return(tot);
}
inline int getfail(int x,int n)
{
    while(s[n-len[x]-1]!=s[n])x=fail[x];
    return(x);
}
int main()
{
    int u;
    scanf("%s",s+1);
    s[0]=-1;fail[0]=1;last=0;
    len[0]=0;len[1]=-1;tot=1;
    int num=strlen(s+1);
    build(1,num,1);
    for(i=1;i<=num;i++)
    {
        u=s[i]-a;
        add(i,1);
    }
    for(i=1;i<=num;i++)
    {
        s[i]-=a;
        p=getfail(last,i);
        if(ch[p][s[i]]==0)
        {
            q=newnode(len[p]+2);
            fail[q]=ch[getfail(fail[p],i)][s[i]];
            ch[p][s[i]]=q;
            int kkk=min(((2*i-len[q]+1)>>1)+1,i);
            ans1[ch[p][s[i]]]=find(i-len[q]+1,kkk,1).count();
        }
        last=ch[p][s[i]];
        cnt[ch[p][s[i]]]++;
    }
    ans=0;
    for(i=tot;i>1;i--)
    {
        cnt[fail[i]]+=cnt[i];
        ans+=cnt[i]*ans1[i];
    }
    printf("%lldn",ans);
    return 0;
} 

?

?

还是好气啊。怪我太着急,一T就慌了。得改。

要好好和队友合作,不能急凸(`⌒′メ)凸

2019-09-08? 00:08:30

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读