HDU 2222 Keywords Search(AC自动机模版题)
Keywords Search
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 57353 Accepted Submission(s): 18820
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.
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.
题目链接:HDU 2222
AC自动机的模版题,有KMP的fail思想,即这条路上找不到了就跟着fail走向另外一条路,将之前的当作前缀继续进行匹配后一部分,若成功则加上这个节点的cnt,推荐一篇博客写得挺好:
AC自动机算法 虽然感觉不是很好理解但是只能硬着头皮看……
代码:
#include <stdio.h>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <string>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 10010;
const int M = 1000010;
struct Trie
{
int nxt[26];
int fail, cnt;
void reset()
{
fill(nxt, nxt + 26, 0);
fail = cnt = 0;
}
};
Trie L[N * 55];
int sz;
char t[55], S[M]; void init()
{
sz = 1;
L[0].reset();
}
void ins(char s[])
{
int len = strlen(s);
int u = 0;
for (int i = 0; i < len; ++i)
{
int v = s[i] - 'a';
if (!L[u].nxt[v])
{
L[sz].reset();
L[u].nxt[v] = sz++;
}
u = L[u].nxt[v];
}
++L[u].cnt;
}
namespace Aho
{
void build()
{
queue<int>Q;
L[0].fail = -1;
Q.push(0);
while (!Q.empty())
{
int u = Q.front();
Q.pop();
for (int i = 0; i < 26; ++i)
{
int v = L[u].nxt[i];
if (!v)
continue;
Q.push(v);
if (!u)
L[v].fail = 0;
else
{
int f = L[u].fail;
while (f != -1)
{
if (L[f].nxt[i])
{
L[v].fail = L[f].nxt[i];
break;
}
f = L[f].fail;
}
if (f == -1)
L[v].fail = 0;
}
}
}
}
int Count(int u)
{
int ans = 0;
while (u)
{
if (L[u].cnt)
{
ans += L[u].cnt;
L[u].cnt = 0;
}
u = L[u].fail;
}
return ans;
}
int calc(char s[])
{
int ans = 0;
int u = 0;
int len = strlen(s);
for (int i = 0; i < len; ++i)
{
int v = s[i] - 'a';
if (L[u].nxt[v])
u = L[u].nxt[v];
else
{
int f = L[u].fail;
while (f != -1 && L[f].nxt[v] == 0)
f = L[f].fail;
if (f == -1)
u = 0;
else
u = L[f].nxt[v];
}
if(L[u].cnt)
ans += Count(u);
}
return ans;
}
}
int main(void)
{
int T, n;
scanf("%d", &T);
while (T--)
{
init();
scanf("%d", &n);
while (n--)
{
scanf("%s", t);
ins(t);
}
Aho::build();
scanf("%s", S);
printf("%d\n", Aho::calc(S));
}
return 0;
}
HDU 2222 Keywords Search(AC自动机模版题)的更多相关文章
- HDU 2222 Keywords Search(AC自动机模板题)
学习AC自动机请戳这里:大神blog........ 自动机的模板: #include <iostream> #include <algorithm> #include < ...
- HDU 2222 Keywords Search (AC自动机)(模板题)
<题目链接> 题目大意: 给你一些单词,和一个字符串,问你这个字符串中含有多少个上面的单词. 解题分析: 这是多模匹配问题,如果用KMP的话,对每一个单词,都跑一遍KMP,那么当单词数量非 ...
- hdu 2222 Keywords Search ac自动机入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:有N(N <= 10000)个长度不超过50的模式串和一个长度不超过1e6的文本串. ...
- hdu 2222 Keywords Search——AC自动机
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2222 第一道AC自动机! T了无数边后终于知道原来它是把若干询问串建一个自动机,把模式串放在上面跑:而且只 ...
- HDU 2222 Keywords Search (AC自动机)
题意:就是求目标串中出现了几个模式串. 思路:用int型的end数组记录出现,AC自动机即可. #include<iostream> #include<cstdio> #inc ...
- hdu 2222 Keywords Search ac自动机模板
题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...
- hdu2222 KeyWords Search AC自动机入门题
/** 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:题意:给定N(N <= 10000)个长度不大于50的模式串,再给定一个长度为L ...
- hdu 2222 Keywords Search - Aho-Corasick自动机
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdoj 2222 Keywords Search(AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包 ...
随机推荐
- js:方法2. 字符串
String.charAt()/String.charCodeAt() string.charAt(n); n:The index of the character that should be re ...
- Hibernate,一对一外键单向 记录。Timestamp 的一个坑。
首先是2张表 表A: 表B: 其中表B中的FormBaseId对应表A中的SubjectID. 数据库中没有设置外键关系. 下面是2个对应的实体 package questionnaire.model ...
- MFC MSBDutyTable下载地址
点击此处跳转到下载地址 简明教程: 对于非制表人,只需要添加空余时间-新建,然后点星期和节数有课的那个按钮,勾选自己有课的周数.全部勾好后,生成空余时间表.然后查看自己的空余时间表,并导出,发给制表人 ...
- IsPostback的原理
ispostback:就是判断页面是首次加载的,还是数据回发(有get或者post请求过的)后的页面.上代码吧,直观点. 1.asp.net页面 <body> <form id=&q ...
- ccc prefab
MonsterPrefab.js var Helpers = require('Helpers'); cc.Class({ extends: cc.Component, properties: { s ...
- Java集合框架学习总结
转自:http://www.cnblogs.com/oubo/archive/2012/01/07/2394639.html Oubo的博客 以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介 ...
- ACM: 强化训练-Roads in the North-BFS-树的直径裸题
Roads in the North Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu De ...
- URAL 1244. Gentlemen(DP)
题目链接 这题不难啊...标记一下就行了.表示啥想法也没有. #include <cstring> #include <cstdio> #include <string& ...
- 【BZOJ1088】[SCOI2005]扫雷Mine 递推
调LCT奔溃,刷水调节一下. #include <iostream> #include <cstdio> #include <cstring> using name ...
- GSM 短信相关AT指令(转)
// AT+CSMS 选择消息业务AT+CSMS=0 // SMS 的AT 命令兼容GSM 07.05 Phase 2AT+CSMS=1 // SMS 的AT 命令兼容GSM 07.05 Phase ...