HDU 5384 AC自动机
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384
题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和。
分析:之前并不知道AC自动机是用来求什么的,但翻模板的时候看见邝斌的字符串模板里有AC自动机一项,就看了一下,然后发现和题目要解决的问题一模一样。就开始改模板。结果没想到就是个裸的AC自动机,以为会TLE,10^10呢,迟迟不敢交,又被坑了。
目前对原理还一无所知。
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
inline int Max(int a,int b)
{
return a>b?a:b;
}
inline int Min(int a,int b)
{
return a>b?b:a;
}
#define maxnode 600010
#define sigma_size 26
struct Trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
int haha[maxnode];
int f[maxnode];
int sz;
void init()
{
sz=;
memset(ch,,sizeof(ch));
memset(val, , sizeof(val));
memset(f,,sizeof(f));
memset(haha,,sizeof(haha));
}
int idx(char c)
{
return c-'a';
}
int insert(char *s)
{
int u = , len = strlen(s);
for(int i = ; i < len; i++)
{
int c = idx(s[i]);
if(!ch[u][c]) ch[u][c] = sz++;
u = ch[u][c];
}
val[u] ++;
return u;
}
void getFail()
{
queue<int> q;
for(int i = ; i<sigma_size; i++)
if(ch[][i]) q.push(ch[][i]); while(!q.empty())
{
int r = q.front();
q.pop();
for(int c = ; c<sigma_size; c++)
{
int u = ch[r][c];
if(!u)continue;
q.push(u);
int v = f[r];
while(v && ch[v][c] == ) v = f[v]; ///沿失配边走上去 如果失配后有节点 且 其子节点c存在则结束循环
f[u] = ch[v][c];
}
}
}
void find(char *T)
{
int len = strlen(T), j = ;
for(int i = ; i < len; i++)
{
int c = idx(T[i]);
while(j && ch[j][c]==) j = f[j];
j = ch[j][c];
int temp = j;
while(temp)
{
haha[temp]++;
temp = f[temp];
}
}
}
};
Trie ac;
char P[][];
int ans[];
char S1[];
int main()
{
int t,m,n;
scanf("%d",&t);
while(t--)
{
ac.init();
scanf("%d%d",&m,&n);
for(int i = ; i <= m; i++)
{
scanf("%s",P[i]);
}
for(int i = ; i <= n; i++)
{
scanf("%s",S1);
ans[i] = ac.insert(S1);
}
ac.getFail();
for(int i = ; i <= m; i++)
{
memset(ac.haha,,sizeof(ac.haha));
ac.find(P[i]);
int sum = ;
for(int i=; i <= n; i++)
sum += ac.haha[ans[i]];
printf("%d\n",sum);
}
}
return ;
}
AC自动机--改自久野模板
模板:http://blog.csdn.net/qq574857122/article/details/12355091
HDU 5384 AC自动机的更多相关文章
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- hdu 5880 AC自动机
Family View Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 3065 AC自动机(各子串出现的次数)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- HDU 2846 (AC自动机+多文本匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...
- HDU 3065 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...
随机推荐
- java sqlhelper
dbinfo.properties部分: 注意每行末尾不可以有空格 #oracle configure UserName=scott Password=tiger Driver=oracle.jdbc ...
- 【IE6双倍边距】-IE6双倍边距的bug
效果 代码 CSS IE6双倍边距的bug body { margin: 0; padding: 0; } .div1 { width: 200px; height: 200px; backgroun ...
- 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...
- Ionic 的 ng-class 在聊天功能上面的巧妙运用
很多人在问我是ionic好呢?还是react好呢? 其实我只想告诉你去看文档啊,不用用怎么知道哪个合适呢? 嘿嘿但是真的这么问的时候我也不会这么回答的,那岂不是太张狂了哈哈哈 react我确实没有用过 ...
- AseBulkCopy 若干问题的解决方法
场景:数据库 Ase 15.0, Ado.net客户端15.7 Sybase.AdoNet4.AseClient 错误1:使用Transaction报错 错误2: 存储过程"sp_drv_ ...
- 通过JDBK操作数据库
一.配置程序--让我们程序能找到数据库的驱动jar包1.把.jar文件复制到项目中去,整合的时候方便.2.在eclipse项目右击"构建路径"--"配置构建路径" ...
- node开发指南
Node.js 能做什么 正如 JavaScript 为客户端而生,Node.js 为网络而生.Node.js 能做的远不止开发一个网站那么简单,使用 Node.js,你可以轻松地开发: 具有复杂逻辑 ...
- JS常用正则表达式和JS控制输入框输入限制(数字、汉字、字符)
验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数 ...
- WebPack 简明学习教程
WebPack 简明学习教程 字数1291 阅读22812 评论11 喜欢35 WebPack是什么 一个打包工具 一个模块加载工具 各种资源都可以当成模块来处理 网站 http://webpack. ...
- 用JS获取地址栏参数的方法(超级简单)
方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new RegExp("( ...