codeforces 163E e-Government

AC 自动机+fail树DFS序+树状数组

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define N 1000010

int n,m,DFS_tot,Size,S_tot;
struct Node{
    int to,next;
}edge[N*2];
int l[N],r[N],sum[N],head[N],id[N];
bool flag[N];

inline int lowbit(int x)
{
    return x&(-x);
}

void Add(int x,int val)
{
    for(int i=x;i<=Size;i+=lowbit(i))
        sum[i]+=val;
}

int Sum(int x)
{
    int Nowsum=0;
    for(int i=x;i>0;i-=lowbit(i))
        Nowsum+=sum[i];
    return Nowsum;
}

void Addedge(int u,int v)
{
    S_tot++;edge[S_tot].next=head[u];edge[S_tot].to=v;head[u]=S_tot;
}

void DFS(int k)
{
    l[k]=++DFS_tot;
    for(int i=head[k];i;i=edge[i].next)
    {
        int v=edge[i].to;
        DFS(v);
    }
    r[k]=DFS_tot;
}

struct AcAuto{
    int next[N][26],fail[N],end[N];
    int tot,root;
    int New_node()
    {
        for(int i=0;i<26;i++)
            next[tot][i]=-1;
        end[tot++]=0;
        return tot-1;
    }
    void Init()
    {
        tot=0;
        root=New_node();
    }
    void Insert(char *T,int _id)
    {
        int len=(int)strlen(T);
        int now=root;
        for(int i=0;iQ;
        fail[root]=root;
        for(int i=0;i<26;i++)
        {
            if(next[root][i]==-1)
                next[root][i]=root;
            else
            {
                fail[next[root][i]]=root;
                Q.push(next[root][i]);
            }
        }
        while(!Q.empty())
        {
            int now=Q.front();Q.pop();
            end[now]+=end[fail[now]];
            for(int i=0;i<26;i++)
            {
                if(next[now][i]==-1)
                    next[now][i]=next[fail[now]][i];
                else
                {
                    fail[next[now][i]]=next[fail[now]][i];
                    Q.push(next[now][i]);
                }
            }
        }
    }
    void Query(char *T)
    {
        int Ans=0;
        int len=(int)strlen(T);
        int now=root;
        for(int i=0;i


你可能感兴趣的:(Ac自动机)