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).问匹配串中含有哪几种模 ...
随机推荐
- 夕甲甲——孔乙己之C++版
欧欧匹代码的格局,是和别的编程模式不同的:首先要有一个构造函数:基类里只定义了函数的形式,可以随时通过派生增加不同的实现.那些程序员们,每每学会了继承和多态,便可以接一个项目,——这是十年前的事,现在 ...
- iPhone / iPad UI界面设计与图标设计的尺寸设计规范+安卓+网页
①iPhone的设计尺寸 iPhone界面尺寸: 设备 分辨率 状态栏高度 导航栏高度 标签栏(工具栏)高度 iPhone6 plus设计版 1242 × 2208 60px 132px 146px ...
- web.config连接字符串的一些总结
阅读目录: DS01:数据库连接字符串的两种写法 DS02:数据库连接字符串的内容 DS01:数据库连接字符串的两种写法 1.连接字符串的两种写法: <configuration> & ...
- CSS入门
CSS,层叠样式表,是对web页面显示效果进行控制的一套标准.当页面的内容受多种样式控制,将会按照一定的顺序处理.CSS的作用:(1)将网页的内容结构和格式控制分开.(2)可以精确控制页面的所有元素. ...
- 查询Sqlserver数据库死锁的一个存储过程
From:http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会 ...
- 《Android深度探索》(卷1)HAL与驱动开发读后感:
第一章:安卓系统移植与驱动开发概述 全书分为4篇,分别从搭建开发环境,Linux驱动和Android HAL的基础知识,开发Linux驱动的高级技术和分析典型的Linux驱动源代码4个方面介绍Andr ...
- 关于C#的内存释放问题
最近在做一个要循环读取xml文件的功能. 想法是读取一个文件,释放一个文件,这样就不会消耗太多内存. 结果运行起来内存不停涨,最后内存溢出.用gc,disponse,异步都没有用. 后来改成relea ...
- Builder模式
原文来源于http://www.iteye.com/topic/71175 对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程 ...
- Unity3D之GUITexture的坐标体系
Unity3D的GUITexture的坐标,其中x和y的取值在0~1之间,层次使用z来划分,值越大越靠前.
- css3中transition和animation的回调处理
弱鸡最近在准备面试,网上找了一些题,发现一些基础题也完全答不好(┬_┬)看来还是要再接再励啊w(゚Д゚)w 言归正传,今天的主题是CSS3中的动画回调处理,这里动画执行完毕后触发的事件是transit ...