Wireless Password - HDU 2825(ac自动机+状态压缩)
- #include<iostream>
- #include<algorithm>
- #include<stdio.h>
- #include<string.h>
- #include<queue>
- using namespace std;
- const int MAXN = ;
- const int MaxSon = ;
- const int Mod = ;
- const int oo = 1e9+;
- struct Ac_Trie
- {
- int next[MAXN][MaxSon];
- int Fail[MAXN], End[MAXN];
- int cnt, root;
- int newnode()
- {
- for(int i=; i<MaxSon; i++)
- next[cnt][i] = -;
- Fail[cnt] = End[cnt] = false;
- return cnt++;
- }
- void InIt()
- {
- cnt = ;
- root = newnode();
- }
- void Insert(char s[], int t)
- {
- int now = root;
- for(int i=; s[i]; i++)
- {
- int k = s[i]-'a';
- if(next[now][k] == -)
- next[now][k] = newnode();
- now = next[now][k];
- }
- End[now] = <<t;
- }
- void GetFial()
- {
- queue<int>Q;
- int now = root;
- for(int i=; i<MaxSon; i++)
- {
- if(next[now][i] == -)
- next[now][i] = root;
- else
- {
- Fail[next[now][i]] = root;
- Q.push(next[now][i]);
- }
- }
- while(Q.size())
- {
- now = Q.front();
- Q.pop();
- for(int i=; i<MaxSon; i++)
- {
- if(next[now][i] == -)
- next[now][i] = next[Fail[now]][i];
- else
- {
- Fail[next[now][i]] = next[Fail[now]][i];
- Q.push(next[now][i]);
- }
- }
- End[now] |= End[Fail[now]];
- }
- }
- };
- Ac_Trie ac;
- int Find(int i)
- {
- int k=;
- while(i)
- {
- if(i % )
- k++;
- i /= ;
- }
- return k;
- }
- int main()
- {
- int N, M, K;
- int sum[] ={};
- for(int i=; i<; i++)
- sum[i] = Find(i);
- while(scanf("%d%d%d", &N, &M, &K), N+M+K)
- {
- char s[MAXN];
- ac.InIt();
- for(int i=; i<M; i++)
- {
- scanf("%s", s);
- ac.Insert(s, i);
- }
- ac.GetFial();
- int dp[][MAXN][] = {}, op=, Len = <<M;
- dp[][][] = ;
- while(N--)
- {
- memset(dp[op], , sizeof(dp[op]));
- for(int i=; i<ac.cnt; i++)
- for(int k=; k<Len; k++)
- {///把k放中间优化一下...否则超时
- if(dp[op^][i][k] == )
- continue;
- for(int j=; j<MaxSon; j++)
- {
- (dp[op][ac.next[i][j]][k|ac.End[i]] += dp[op^][i][k])%=Mod;
- }
- }
- op ^= ;
- }
- int ans = ;
- for(int i=; i<ac.cnt; i++)
- for(int j=; j<Len; j++)
- {
- if(sum[j] >= K || sum[ac.End[i]|j] >= K)
- {
- ans += dp[op^][i][j];
- ans %= Mod;
- }
- }
- printf("%d\n", ans);
- }
- return ;
- }
Wireless Password - HDU 2825(ac自动机+状态压缩)的更多相关文章
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- hdu 4057(ac自动机+状态压缩dp)
题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...
- hdu 3341(ac自动机+状态压缩)
题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A.T.C.G ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )
模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...
- HDU 4758 Walk Through Squares( AC自动机 + 状态压缩DP )
题意:给你两个串A,B, 问一个串长为M+N且包含A和B且恰好包含M个R的字符串有多少种组合方式,所有字符串中均只含有字符L和R. dp[i][j][k][S]表示串长为i,有j个R,在自动机中的状态 ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- bzoj1195 神奇的ac自动机+状态压缩dp
/* 难的不是ac自动机,是状态压缩dp 之前做了一两题类似题目,感觉理解的还不够透彻 */ #include<iostream> #include<cstdio> #incl ...
随机推荐
- SQL Server Management Studio的对象资源管理器的使用
1.查看 2.对象资源管理器 3.点到某个表的身上 4.出现以下图片,因为有时动态创建的触发器,刷新表下面的触发器可能不出来,所以来这里面找
- 微信小程序开发之 下拉刷新,上拉加载更多
本文记载了如何在微信小程序里面实现下拉刷新,上拉加载更多 先开看一下界面 大致如此的界面吧. 这个Demo使用了微信的几个Api和事件,我先列出来. 1.wx.request (获取远程服务器的数据, ...
- topcoder算法练习3
SRM144 DIV1 1100 point Problem Statement NOTE: There are images in the examples section of this ...
- alsa utils工具使用
1.amixer用于控制设置 amixer [-c card] [cmd] ./amixer contents ./amixer cset ./amixer cget 2. aplay ./aplay ...
- Bootstrap_Javascript_按钮插件
一 . 加载状态按钮 HTML: <button class="btnbtn-primary" data-loading-text="正在加载中,请稍等...&qu ...
- css中文字体乱码解决方案
css中文字体乱码解决方案:把css编码和html页面编码统一起来.如果html页面是utf-8.css.js也统一成utf-8编码.还有一个避免中文乱码的办法就是把中文字体写成英文来表示 css中文 ...
- javascript实现ajax
什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...
- 简单学C——第一天
基本功 一.数据类型: 在C语言中,有数据类型这一说法.为何有这一说法?是因为在现实生活中存在着不同的数据,(例如整数,小数,字符即a b c d , . ; " 之类).由于计算机中所有 ...
- 用硬件(Verilog)实现二进制码和格雷码的转换
格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环. ...
- C语言中的字节对齐以及其相关处理
首先,我们来了解下一些基本原理: 一.什么是字节对齐一个基本类型的变量在内存中占用n个字节,则该变量的起始地址必须能够被n整除,即: 存放起始地址 % n = 0,那么,就成该变量是字节对齐的;对于结 ...