HDU 5880 Family View(AC自动机)

来源:互联网 发布:php 输出等边三角形 编辑:程序博客网 时间:2024/06/09 18:55
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn=1000000+100;char p[maxn];int nxt[maxn][26],l[maxn],badnode[maxn],pre[maxn],vis[maxn];int L,root;int newnode(){    for(int i=0;i<26;i++)        nxt[L][i]=-1;    l[L]=0;    badnode[L++]=-1;    return L-1;}void intial(){    L=0;    root=newnode();}void Insert(char *ss){    int now=root;    int len=(int)strlen(ss);    for(int i=0;i<len;i++)    {        int idx=ss[i]-'a';        if(nxt[now][idx]==-1)            nxt[now][idx]=newnode();        now=nxt[now][idx];    }    badnode[now]=1;    l[now]=len;}void BuildDFA(){    queue<int> q;    pre[root]=root;    for(int i=0;i<26;i++){        if(nxt[root][i]==-1)            nxt[root][i]=root;        else{            pre[nxt[root][i]]=root;            q.push(nxt[root][i]);        }    }    while(!q.empty())    {        int now=q.front();q.pop();        for(int i=0;i<26;i++)        {            if(nxt[now][i]==-1)                nxt[now][i]=nxt[pre[now]][i];            else{                pre[nxt[now][i]]=nxt[pre[now]][i];                q.push(nxt[now][i]);            }        }    }}void work(){    memset(vis,0,sizeof(vis));    int now=root;    int len=(int)strlen(p);    for(int i=0;i<len;i++)    {        int idx=0;        if(p[i]>='A'&&p[i]<='Z') idx=p[i]-'A';        else if(p[i]>='a'&&p[i]<='z') idx=p[i]-'a';        else continue;        now=nxt[now][idx];        int cur=now;        while(cur!=root)        {            if(badnode[cur]!=-1)            {                vis[i+1]--;                vis[i-l[cur]+1]++;                break;            }                        cur=pre[cur];        }    }    long long ans=0;    for(int i=0;i<len;i++)    {        ans+=vis[i];        if(ans>0) printf("*");        else printf("%c",p[i]);    }    printf("\n");}int main(){    int t,n;    scanf("%d",&t);    while(t--)    {        intial();        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%s",p);            Insert(p);        }        BuildDFA();        getchar();        gets(p);        work();    }    return 0;}

0 0
原创粉丝点击