【Ac自動機 查詢是否存在一個字典中的字串】hihocoder 1036 Trie圖
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[N];
struct Aho
{
struct Node{
int nex[M];
int fail,endd;
}node[N];
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[N];
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");
}
相關文章
- AC自動機+trie樹實現高效多模式匹配字典模式
- 判斷某一個字串是否存在另一個字串中字串
- AC自動機+字典序+樹狀陣列陣列
- python怎麼查詢字串中是否包含某個字串Python字串
- 【Tire 求字典出現的字首個數】hihocoder 1014 Trie樹
- hihocoder trie 樹
- Python判斷一個檔案中的字串是否存在於另外一個檔案中Python字串
- SQL查詢是否”存在”的新方法SQL
- 查詢資料庫表是否存在資料庫
- [複習] AC自動機
- AC自動機 提高篇
- javascript中檢測某個字串在陣列中是否存在JavaScript字串陣列
- Linux - 查詢目錄下的所有檔案中是否含某個字串Linux字串
- SQL2008查詢某資料庫中的某個值是否存在SQL資料庫
- 一個簡單的字串查詢程式字串
- 字典樹(Trie)
- 字典樹Trie
- javascript如何檢測一個圖片是否存在JavaScript
- 【轉】linux查詢目錄下的所有檔案中是否含有某個字串Linux字串
- AC自動機:Tire樹+KMPKMP
- 判斷python字典中key是否存在的兩種方法Python
- Javascript 是如何檢查一個存在的、非空的字串?JavaScript字串
- Trie樹,字典樹
- 查詢當前資料庫存在某個字串的儲存過程資料庫字串儲存過程
- MySQL 查詢字串的個數MySql字串
- AC 自動機——多模式串匹配模式
- AC自動機學習筆記筆記
- 【Ac自動機】hdu 5880 Family ViewView
- AC 自動機學習筆記筆記
- 查詢字串中第一個非重複字元的3種方法字串字元
- C++查詢一個數是否在陣列中find用法C++陣列
- POJ 3691 DNA repair (AC自動機 + dp)AI
- hihocoder 1014 Trie樹 (Trie 記模板 陣列+指標)陣列指標
- MySQL自聯合查詢的一個例子MySql
- PHP 判斷一個字元是否在字串中PHP字元字串
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- 檢查貨幣是否存在SAP系統中
- Python中查詢字串某個字元最常用的方法!Python字串字元