【Ac自动机 查询是否存在一个字典中的字符串】hihocoder 1036 Trie图
2017-08-23 19:23
381 查看
Link:http://hihocoder.com/problemset/problem/1036?sid=1157591
// 需要优化 #include <bits/stdc++.h> using namespace std; const int N = 1000110; const int M = 26; const int root = 0; int n,len ; struct Aho { struct Node{ int nex[M]; int fail,endd; }node ; int Size; queue<int> que; int newnode(){ for(int i = 0; i < M; i++) node[Size].nex[i] = 0; node[Size].fail = node[Size].endd = 0; return Size++; } void init(){ while(que.size()) que.pop(); Size = root; newnode(); } void Insert(char *s) { int L = strlen(s); int now = root; for(int i = 0; i < L; i++){ int x = s[i]-'a'; if(node[now].nex[x]==0) node[now].nex[x]=newnode(); now = node[now].nex[x]; } node[now].endd = 1; } void build() { node[root].fail = root; for(int i = 0; i < M; i++) { if(node[root].nex[i]) { node[node[root].nex[i]].fail = root; que.push(node[root].nex[i]); } } while(que.size()) { int u = que.front(); que.pop(); for(int i = 0; i < M; i++) { if(node[u].nex[i]==0) node[u].nex[i] = node[node[u].fail].nex[i]; else { node[node[u].nex[i]].fail = node[node[u].fail].nex[i]; que.push(node[u].nex[i]); if(node[node[node[u].nex[i]].fail].endd) node[node[u].nex[i]].endd = 1; //优化,与普通的AC自动机不同,因为只要有河蟹词就返回,所以有河蟹词后缀的也标记危险,去掉查询时通过while查询后缀 } } } } int marth(char *s) { int L = strlen(s); int now = root; for(int i = 0; i < L; i++) { int x = s[i]-'a'; now = node[now].nex[x]; if(node[now].endd) return 1; } return 0; } }aho; char s ; int main() { int n; scanf("%d",&n); aho.init(); for(int i = 0; i < n; i++) { scanf("%s",s); aho.Insert(s); } aho.build(); scanf("%s",s); if(aho.marth(s)) puts("YES"); else puts("NO"); }
相关文章推荐
- 当查询一个列表的时候获取此列表id结果作为另一个sql的是否存在的条件处理
- smarty中判断一个变量是否存在于一个数组中或是否存在于一个字符串中?
- php中 如何验证一个字符串中是否存在某个字符串
- 【路径相关方法】6,判断一个字符串是否为一个文件夹路径形式(无论存在与否)
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- Python判断一个文件中的字符串是否存在于另外一个文件中
- java中怎么判断一个字符串是否存在数组中
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
- 编写函数实现一个字符串在另一个字符串中是否存在
- JavaScript 里如何判断一个字符串里是否存在某个字符串?(支持中文)
- mysql 查询字符串判断某个字符串是否存在某个字段中
- poj 3630 Phone List 【字典树】【判断一个字符串集里面 是否存在一个字符串是另一个字符串前缀】
- 给定一个源字符串,一个字符串字典,判断该字典是否是由源字符串完全分割而来的
- Python3基础 dic in/not in 查询一个字符是否指定字典的键或者值
- 给定两个字符串和一个字典,从头到尾找到最短变换序列的长度,使得:一次只能改变一个字符每个中间词必须存在于字典中
- C语言-在一个字符串中查找是否存在另外一个字符串+查找字符串大写字母个数
- 一月十日练习习题,1数组数据存入字典并输出2降序 和倒叙 输出数组中内容3对字符串当中信息进行查找是否存在4 把数组当中信息按照中文排序
- leetcode 240 查询一个排序好的矩阵中是否存在target
- 获取windows进程列表,并以字符串形式查询是否存在某一进程
- 通过JS,Jquery判断某个字符在一个字符串中是否存在的方法