hdu2222 AC自動機-給定串中出現了幾個模式串
http://acm.hdu.edu.cn/showproblem.php?pid=2222
Problem Description
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc.
Wiskey also wants to bring this feature to his image retrieval system.
Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched.
To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match.
Wiskey also wants to bring this feature to his image retrieval system.
Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched.
To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match.
Input
First line will contain one integer means how many cases will follow by.
Each case will contain two integers N means the number of keywords and N keywords follow. (N <= 10000)
Each keyword will only contains characters 'a'-'z', and the length will be not longer than 50.
The last line is the description, and the length will be not longer than 1000000.
Each case will contain two integers N means the number of keywords and N keywords follow. (N <= 10000)
Each keyword will only contains characters 'a'-'z', and the length will be not longer than 50.
The last line is the description, and the length will be not longer than 1000000.
Output
Print how many keywords are contained in the description.
Sample Input
1
5
she
he
say
shr
her
yasherhs
Sample Output
3
/**
hdu2222 AC自動機-給定串中出現了幾個模式串
解題思路:AC自動機模板題
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct Trie
{
int next[500010][26],fail[500010],end[500010];
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]++;
}
void build()
{
queue<int>Q;
fail[root]=root;
for(int i=0; i<26; 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 now=root;
int res=0;
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;
}
} ac;
char buf[1000010];
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",buf);
ac.insert(buf);
}
ac.build();
scanf("%s",buf);
printf("%d\n",ac.query(buf));
}
return 0;
}
相關文章
- hdu5384 AC自動機模板題,統計模式串在給定串中出現的個數模式
- hdu2896 AC自動機-標記哪些模式串在目標串中出現過模式
- hdu3065 AC自動機-每個標準串在模式串中出現的次數模式
- AC 自動機——多模式串匹配模式
- 自動機都收到了什麼串
- AC自動機+trie樹實現高效多模式匹配字典模式
- 編寫一個程式實現模式串的各種模式匹配模式
- 自己實現一個 DFA 串模式識別器(一)模式
- 自己實現一個 DFA 串模式識別器(二)模式
- 串的基本運算實現-加密解密串加密解密
- [複習] AC自動機
- AC自動機 提高篇
- AC自動機:Tire樹+KMPKMP
- 04.子串,啟動!
- Aho-Corasick 演算法 AC自動機實現演算法
- AC自動機學習筆記筆記
- 【Ac自動機】hdu 5880 Family ViewView
- AC 自動機學習筆記筆記
- 串(2)--模式匹配演算法模式演算法
- 深度學習與計算機視覺系列(9)_串一串神經網路之動手實現小例子深度學習計算機視覺神經網路
- 子串查詢;及排列子串分析
- C#拼接Json串的幾種方法C#JSON
- POJ 3691 DNA repair (AC自動機 + dp)AI
- 子串位置
- POJ 3294 Life Forms(字尾陣列求k個串的最長子串)ORM陣列
- 【練習】串的堆分配實現
- 【練習】塊鏈串的實現
- 串的堆分配表示與實現
- 從零開始發明 AC 自動機
- AC自動機+字典序+樹狀陣列陣列
- 順序結構儲存串實現串萬用字元匹配的演算法字元演算法
- 假設串S1 = "I come from Beijing",S2 = "Chongqing" ,Sub = "America". 利用串的基本操作,如果串的賦值、串的插入、串的刪除、串的替換、對上面賦值
- 鑰匙串密碼忘記了怎麼辦?如何在Mac上重置鑰匙串密碼密碼Mac
- 子串查詢
- 查詢子串
- C# 格式串C#
- 最長子串
- 基於Python+requests搭建的自動化框架-實現流程化的介面串聯Python框架