• [模板]洛谷T3808 AC自动机(简单版)


      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 #include<cmath>
      5 #include<ctime>
      6 #include<cstdlib>
      7 
      8 #include<string>
      9 #include<stack>
     10 #include<queue>
     11 #include<vector>
     12 #include<algorithm>
     13 #include<map>
     14 #include<set>
     15 
     16 #define inf 2147483647
     17 #define ri register int
     18 #define ll long long
     19 
     20 using namespace std;
     21 
     22 inline void read(int &x){
     23     x=0;
     24     char t=getchar();
     25     bool f=0;
     26     
     27     while(t<'0' || t>'9'){
     28         if(t=='-')f=1;
     29         t=getchar();
     30     }
     31     
     32     while(t>='0' && t<='9'){
     33         x=(x<<3)+(x<<1)+t-'0';
     34         t=getchar();
     35     }
     36     
     37     if(f)x=-x;
     38 }
     39 
     40 inline int idx(char t){
     41     return t-'a';
     42 }
     43 
     44 struct que{
     45     int q[1000005];
     46     int head,tail;
     47     
     48     inline void clear(){
     49         head=tail=0;
     50     }
     51     
     52     inline bool emp(){
     53         return head==tail;
     54     }
     55     
     56     inline void push(int x){
     57         q[tail]=x;
     58         tail++;
     59         if(tail==1000005)tail=0;
     60     }
     61     
     62     inline void pop(){
     63         head++;
     64         if(head==1000005)head=0;
     65     }
     66     
     67     inline int top(){
     68         return q[head];
     69     }
     70 };
     71 
     72 struct node{
     73     int ch[26];
     74     int val;
     75     int next;
     76     int last;
     77     
     78     inline void make(){
     79         memset(ch,0,sizeof(ch));
     80         val=next=last=0;
     81     }
     82 };
     83 
     84 inline void insert();
     85 inline void bfs();
     86 void work(int);
     87 
     88 node trie[1000005];
     89 int pn=1;
     90 
     91 que q;
     92 
     93 char S[1000005];
     94 int lens;
     95 char T[1000005];
     96 int lent;
     97 
     98 int n,poi=0,c,ans=0;
     99 
    100 int main(){
    101     trie[0].make();
    102     
    103     read(n);
    104     
    105     for(ri i=1;i<=n;i++){
    106         scanf("%s",S+1);
    107         lens=strlen(S+1);
    108         insert();
    109     }
    110     
    111     bfs();
    112     
    113     scanf("%s",T+1);
    114     lent=strlen(T+1);
    115     
    116     for(ri i=1;i<=lent;i++){
    117         c=idx(T[i]);
    118         
    119         while(poi && !trie[poi].ch[c])poi=trie[poi].next;
    120         poi=trie[poi].ch[c];
    121         
    122         work(poi);
    123     }
    124     
    125     printf("%d
    ",ans);
    126     
    127     return 0;
    128 }
    129 
    130 inline void insert(){
    131     int u=0,c;
    132     
    133     for(ri i=1;i<=lens;i++){
    134         c=idx(S[i]);
    135         
    136         if(!trie[u].ch[c]){
    137             trie[pn].make();
    138             trie[u].ch[c]=pn;
    139             pn++;
    140         }
    141         
    142         u=trie[u].ch[c];
    143     }
    144     
    145     trie[u].val++;
    146 }
    147 
    148 inline void bfs(){
    149     int u,v;
    150     
    151     q.clear();
    152     
    153     for(ri i=0;i<26;i++)
    154         if(trie[0].ch[i])
    155             q.push(trie[0].ch[i]);
    156     
    157     while(!q.emp()){
    158         u=q.top();
    159         q.pop();
    160         
    161         for(ri i=0;i<26;i++){
    162             v=trie[u].ch[i];
    163             
    164             if(!v){
    165                 trie[u].ch[i]=trie[trie[u].next].ch[i];
    166                 continue;
    167             }
    168             
    169             q.push(v);
    170             trie[v].next=trie[trie[u].next].ch[i];
    171             if(trie[trie[v].next].val)
    172                 trie[v].last=trie[v].next;
    173             else
    174                 trie[v].last=trie[trie[v].next].last;
    175         }
    176     }
    177 }
    178 
    179 void work(int now){
    180     if(now){
    181         ans+=trie[now].val;
    182         trie[now].val=0;
    183         
    184         work(trie[now].last);
    185     }
    186 }
  • 相关阅读:
    Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo
    Hibernate(1)——数据访问层的架构模式
    JVM学习(4)——全面总结Java的GC算法和回收机制
    JVM学习(3)——总结Java内存模型
    JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
    JVM学习(1)——通过实例总结Java虚拟机的运行机制
    减小内存的占用问题——享元模式和单例模式的对比分析
    继承、组合和接口用法——策略模式复习总结
    软件工程的引入:Scrum开发框架总结
    软件工程里的UML序列图的概念和总结
  • 原文地址:https://www.cnblogs.com/running-coder-wfh/p/7965866.html
Copyright © 2020-2023  润新知