hdu2222--Keywords Search+AC自動機模板
題目連結:點選進入
KMP對模式串進行處理,然後就可以方便的判斷模式串是否在目標串中出現了;這顯示適合一個模式串多個目標串的情況。但是如果模式串有多個,這時如果還用KMP則需要對每個串都進行一次處理,顯然不是很合適。其實這時候可以將所有模式串建成一棵trie樹,然後採用類似於kmp的方法計算出failed指標,也就可以方便的進行匹配了。其實這就是ac自動機的思想。
程式碼如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=500000+100;
struct Trie
{
///next陣列表示的就是trie樹
///fail陣列記錄了每個節點的失敗指標
///end陣列記錄了以當前節點作為結尾的字串的個數
int next[maxn][26],fail[maxn],end[maxn];
///root表示trie的根節點,L表示當前trie的節點總數
int root,L;
int newnode()
{
for(int i=0;i<26;i++)
next[L][i]=-1;
end[L++]=0;
return L-1;
}
void init()
{
L=0;
root=newnode();
}
void insert(char buf[])
{
int len=strlen(buf);
int now=root;
for(int i=0;i<len;i++)
{
if(next[now][buf[i]-'a']==-1)
next[now][buf[i]-'a']=newnode();
now=next[now][buf[i]-'a'];
}
end[now]++;
}
///採用bfs形式構造fail指標
void build()
{
queue<int>Q;
fail[root]=root;
for(int i=0;i<26;i++)
{
///如果當前節點的第i個兒子不存在
///則將其補上,為當前節點失敗節點的第i個兒子
if(next[root][i]==-1)
next[root][i]=root;
else
{
fail[next[root][i]]=root;
Q.push(next[root][i]);
}
}
while(!Q.empty())
{
int now=Q.front();
Q.pop();
for(int i=0;i<26;i++)
{
if(next[now][i]==-1)
next[now][i]=next[fail[now]][i];
else
{
fail[next[now][i]]=next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
}
int query(char buf[])
{
int len=strlen(buf);
int res=0;
int now=root;
for(int i=0;i<len;i++)
{
now=next[now][buf[i]-'a'];
int temp=now;
while(temp != root)
{
res+=end[temp];
end[temp]=0;
temp=fail[temp];
}
}
return res;
}
};
char str[maxn*2];
Trie ac;
int main()
{
int T;
int n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ac.init();
for(int i=0;i<n;i++)
{
scanf("%s",str);
ac.insert(str);
}
ac.build();
scanf("%s",str);
printf("%d\n",ac.query(str));
}
return 0;
}
相關文章
- pbootcms模板自動清理runtime快取,自動清理快取boot快取
- PbootCMS模板自動清理runtime快取boot快取
- 自動機
- KMP 自動機KMP
- 杜教BM線性遞推自動化模板
- phpcmsV9手機模組外掛,自帶模板PHP
- PbootCMS模板自動生成當前頁面二維碼boot
- java版app自動化測試初始化模板JavaAPP
- 編寫可調模板並使用自動調諧器
- KVM虛機開機自啟和取消自啟動
- 實現一個程式碼自動生成(一):模板引擎Freemarker
- [複習] AC自動機
- AC自動機 提高篇
- 機器人使機床自動化機器人
- Flutter json解析json_serializable的使用及自動化生成模板FlutterJSON
- oracle配置開機自啟動Oracle
- Linux 新增開機自啟動Linux
- AC自動機:Tire樹+KMPKMP
- Linux開機自啟動配置Linux
- Android開機自啟動程式Android
- 簡單版AC自動機
- 交換機統一監控和遠端控制:自動發現、自動監控、自動告警、自動修復
- Windows10 開機自動啟動 VagrantWindows
- nginx 加入到開機自動啟動Nginx
- 讓BI自動生成零售資料分析報表?用模板
- kafkaer:基於模板的 Kafka 主題/叢集/ACL 管理自動化Kafka
- 電腦自動關機是什麼原因 電腦自動關機怎麼解決
- 【SHOI2015】自動刷題機
- win10 夜晚自動關機Win10
- AC 自動機學習筆記筆記
- Windows開機自動同步時間Windows
- 【筆記】字尾自動機 SAM筆記
- MacBook取消開蓋自動開機Mac
- AC自動機學習筆記筆記
- AC 自動機——多模式串匹配模式
- 專題十七 AC自動機【Kuangbin】
- windows如何開機自動啟動某些應用?Windows
- 【OEM】Oracle oem取消開機自動啟動(linux)OracleLinux