bzoj 3879: SvT 접미사 로봇 + 접미사 트리 + 빈 트리
#includefor(int i=19;i>=0;i--) if(deep[fa[x][i]]>=deep[y]) x=fa[x][i];
    if(x==y) return x;
    for(int i=19;i>=0;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
int aa[4000000];
bool cmp(int a,int b)
{
    return id[a]int my_stack[4000000];
int main()
{
    mempool[1].id=1;
    int n,m;
    scanf("%d%d",&n,&m);
    scanf("%s",s+1);
    using namespace IStream;
    for(int i=n;i>=1;i--)
    {
        Insert(s[i]-'a');
        pos[i]=last->id;
    }
    for(int i=2;i<=now;i++)
        add_edge(mempool[i].parent->id,mempool[i].id);
    dfs(1,0);
    init();
    for(int hh=1;hh<=m;hh++)
    {
        T++;
        ans=0;
        tot=1;
        int nn;
        nn=get_int();
        for(int i=1;i<=nn;i++)
        {
            aa[i]=get_int();
            aa[i]=pos[aa[i]];
            pd[aa[i]]=T;
        }
        sort(aa+1,aa+1+nn,cmp);
        int top=1;
        my_stack[top]=1;
        for(int i=1;i<=nn;i++)
        {
            if(aa[i]==aa[i-1]) continue;
            int lca=get_lca(aa[i],my_stack[top]);
            while(1)
            {
                if(top>1 && deep[lca]1]])
                {
                    add_edge(my_stack[top-1],my_stack[top]);
                    top--;
                }
                else if(deep[lca]break;
                }
                else break;
            }
            if(my_stack[top]!=lca) my_stack[++top]=lca;
            my_stack[++top]=aa[i];
        }
        while(top>1)
        {
            add_edge(my_stack[top-1],my_stack[top]);
            top--;
        }
        dp(1,0);
        printf("%lld
",ans);
    }
    return 0;
}
    이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[CTSC2012] 익숙한 글제목의 뜻 여러 개의 주열이 있고, 매번 문의할 때마다 질문열을 여러 개의 연속 서브열로 나누며, 만약 한 서브열의 길이가 ≥L≥L이고 주열에 나타난 적이 있다면 합법적이다 만약 합법적인 하위 문자열의 총 길이가 ≥...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.