zoukankan      html  css  js  c++  java
  • HDU 5880 Family View

      1 /*
      2 HDU 5880 Family View
      3 http://acm.hdu.edu.cn/showproblem.php?pid=5880
      4 AC自动机
      5 注意不要直接全把节点初始化,将其当做内存池来用,
      6 用的时候再初始化,否则会MLE
      7 */
      8 #include<cstdio>
      9 #include<cstring>
     10 #include<queue>
     11 #include<algorithm>
     12 using namespace std;
     13 const int Nmax=1000010;
     14 const int Totmax=1000010;
     15 struct Aho
     16 {
     17     struct State
     18     {
     19         int next[26];
     20         int cnt,fail,num;
     21     }state_table[Totmax];
     22 
     23     int size;
     24     int ans[Nmax];
     25     queue<int> Q;
     26     void init()
     27     {
     28         for(int i=0;i<Nmax;i++)
     29             ans[i]=0;
     30         while(Q.size())
     31             Q.pop();
     32         for(int j=0;j<26;j++)                
     33             state_table[0].next[j]=-1;
     34         state_table[0].fail=state_table[0].cnt=state_table[0].num=0;
     35         size=1;
     36     }
     37 
     38     void insert(char *s)
     39     {
     40         int n=strlen(s);
     41         int now=0;
     42         for(int i=0;i<n;i++)
     43         {
     44             char c=s[i];
     45             if(state_table[now].next[c-'a']==-1)
     46             {
     47                 for(int j=0;j<26;j++)
     48                     state_table[size].next[j]=-1;
     49                 state_table[size].cnt=state_table[size].fail=state_table[size].num=0;
     50                 state_table[now].next[c-'a']=size++;
     51             }
     52             now=state_table[now].next[c-'a'];
     53         }
     54         state_table[now].cnt++;
     55         state_table[now].num=n;
     56     }
     57 
     58     void build()
     59     {
     60         Q.push(0);
     61         state_table[0].fail=0;
     62         while(Q.size())
     63         {
     64             int now=Q.front();
     65             Q.pop();
     66             for(int i=0;i<26;i++)
     67             {
     68                 if(now==0)
     69                 {
     70                     if(state_table[now].next[i]==-1)
     71                         state_table[now].next[i]=0;
     72                     else
     73                     {
     74                         state_table[ state_table[now].next[i] ].fail=0;
     75                         Q.push(state_table[now].next[i]);
     76                     }
     77                 }
     78                 else
     79                 {
     80                     if(state_table[now].next[i]==-1)
     81                     {
     82                         state_table[now].next[i]=state_table[ state_table[now].fail ].next[i]; 
     83                     }    
     84                     else
     85                     {
     86                         state_table[ state_table[now].next[i] ].fail=state_table[ state_table[now].fail ].next[i];
     87                         Q.push(state_table[now].next[i]);
     88                     }
     89                 }
     90                 
     91             }
     92         }
     93     }
     94 
     95     void match(char *s)
     96     {
     97         int n=strlen(s);
     98         int now=0;
     99         for(int i=0;i<n;i++)
    100         {
    101             char c=s[i];
    102             if(c>='A' && c<='Z')
    103                 now=state_table[now].next[c-'A'];
    104             else if(c>='a' && c<='z')
    105                 now=state_table[now].next[c-'a'];
    106             else
    107                 now=0;
    108             int x = now;
    109             while(x != 0)
    110             {
    111                 if(state_table[x].cnt)
    112                 {
    113                     int k=state_table[x].num;
    114                     int j=i;
    115                     while(k--)
    116                     {
    117                         s[j]='*';
    118                         j--;
    119                     }
    120                     break;
    121                 }
    122                 x = state_table[x].fail;
    123             }
    124  
    125         }
    126     }
    127 
    128      void solve(char *s)
    129      {
    130         int now = 0;
    131         int len = strlen(s);
    132         int index;
    133         for(int i = 0; i < len ; ++i)
    134         {
    135             if(s[i] >= 'A' && s[i] <= 'Z')
    136                 index = s[i] - 'A';
    137             else if(s[i] >= 'a' && s[i] <= 'z')
    138                 index = s[i] - 'a';
    139             else 
    140             {
    141                 now=0;
    142                 continue;
    143             }
    144             now =state_table[now].next[index];
    145             int x = now;
    146             while(x != 0)
    147             {
    148                 if(state_table[x].cnt)
    149                 {
    150                     ans[i + 1] -= 1;
    151                     ans[i - state_table[x].num + 1] += 1;
    152                     break;
    153                 }
    154                 x = state_table[x].fail;
    155             }
    156         }
    157     }
    158 
    159     void print(char *s)
    160     {
    161         long long res = 0;
    162         int len = strlen(s);
    163         for(int i = 0; i < len; ++i)
    164         {
    165             res += ans[i];
    166             if(res <= 0)
    167                 printf("%c", s[i]);
    168             else printf("*");
    169         }
    170         puts("");
    171     }
    172 
    173 
    174 
    175 
    176 
    177 }aho;
    178 char s[Nmax];
    179 int main()
    180 {
    181     int t;
    182     //freopen("in.in","r",stdin);
    183     scanf("%d",&t);
    184     while(t--)
    185     {
    186         int n;
    187         aho.init();
    188         scanf("%d",&n);
    189         while(n--)
    190         {
    191             scanf("%s",s);
    192             aho.insert(s);
    193         }
    194         getchar();
    195         gets(s);
    196         //printf("%s
    ",s);
    197         aho.build();
    198         //aho.match(s);
    199         //printf("%s
    ",s); 
    200         
    201         aho.solve(s);
    202         aho.print(s);
    203         
    204 
    205     }
    206     return 0;
    207 }
  • 相关阅读:
    从零开始编写自己的C#框架(7)——需求分析
    从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)
    Vim技能修炼教程(13)
    Linux存储入门:简易数据恢复方案--分区和LVM实战
    物联网如何跳出“看起来很美”?
    农业的未来:物联网农业传感器农业无人机
    综合布线系统技术是建设智慧城市的血脉
    7月13日云栖精选夜读:什么才是这个时代最需要的BI人员? —— 阿里云MVP赵玮主题分享
    阿里巴巴集团技术委员会主席王坚:我曾经被诺贝尔奖得主司马贺忽悠_相信人工智能就是未来!
    如何送货最省钱?菜鸟自研核心引擎架构首次曝光!
  • 原文地址:https://www.cnblogs.com/BBBob/p/6537218.html
Copyright © 2011-2022 走看看