[模板]洛谷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\n",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 }
时间: 2024-10-10 07:20:21

[模板]洛谷T3808 AC自动机(简单版)的相关文章

[模板][P3808]AC自动机(简单版)

模板,详见代码: #include<bits/stdc++.h> using namespace std; const int mxn=1e7+5; char str[mxn],p[80]; queue<int > q; namespace Trie { int tot,fail[mxn],val[mxn]; int t[mxn][26]; void ins(char *s) { int len=strlen(s),u=0; for(int i=0;i<len;++i) {

【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格

[模板]洛谷T3369 普通平衡树 链表&amp;递归版、无父指针版Splay

结构体node定义:呐...因为不是Treap,所以就不必定义优先级yx了: 这次为了代码简短,总算是把判断子树方向函数(cmp)和节点信息维护函数(maintain)封在了结构体里. 旋转函数rotate:与Treap相比,没有任何变化,就是写得简短了一些. 插入函数insert:Treap时需要对违反堆性质的节点进行上浮的操作现在不需要了,只需同普通BST一样直接插入即可. 插完后,对刚插入的节点执行Splay操作. 删除函数del:针对待删除节点左右子树均非空的情况,Treap做法是将左右

[模板]洛谷T3391 文艺平衡树 链表&amp;递归版、无父指针版Splay

指针大法好 无父指针Splay大法好 大佬们的"改变旋转方向"萌新表示不懂,于是就自己乱搞出了下面的搞法... 代码如下,萌新写的丑,诸位大佬见谅QwQ~ 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<ctime> 5 #include<cstdlib> 6 #include<ctime> 7 8 #include<

最小费用最大流基础模板(洛谷3381)

如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向P3381 [模板]最小费用最大流边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式: 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用. 输入样例#1:

[模板]洛谷T3373 线段树 模板2

此题相对于模板一,加了个区间乘,于是在模板一的基础上需要多开个数组(记录乘法懒标记).多写个函数(区间乘),还有要把懒标记下放函数做些修改. 变量定义: sum[]:线段树节点对应区间的元素总和: addv[]:线段树节点对应区间的所有元素待加的值(懒标记),初值全部设为0: mulv[]:线段树节点对应区间的所有元素待乘的值(懒标记),初值全部设为1. 过程说明: 建树(Build): 同模板一... 懒标记下放(Push_down): 原理解释: 1.当对某区间执行加法操作时,由于加法优先级

洛谷 P3804 后缀自动机

题目描述 给定一个只包含小写字母的字符串SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SS 输出格式: 一个整数,为 所求答案 输入输出样例 输入样例#1: abab 输出样例#1: 4 说明 对于10\%10% 的数据,|S|<=1000∣S∣<=1000 对于100\%100% 的数据,|S|<=10^6∣S∣<=106 今天上午恶补了一下后缀自动机,发现好像没有想象中的那么

[模板]洛谷T2042 NOI2005 维护数列 Splay

PS:某大佬讲,当心情特别好or特别不好的时候,可以来攻略这个题...果然萌新足足被这题恶心了半个月... 进入正题: 这道题题意如此之裸-Splayの究极进化,那么就没有什么好讲的,直接说搞法好了... 为了代码写起来方便,萌新封装得可能有些过,若不合诸位大佬的口味还请见谅~ 节点node结构体定义: key:节点原值:size:子树大小:ch[2]:子树指针: set_pd:记录是否打了MAKE-SAME的懒标记:setv:MAKE-SAME的修改值:turn:记录是否旋转: sum:子树元

[模板]洛谷T3374 树状数组 模板1

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #include<ctime> 6 #include<cstdlib> 7 8 #include<algorithm> 9 #include<string> 10 #include<stack> 11 #include<queue>