HDU - 2825 Wireless Password (AC自动机+状压DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825
题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数。
题解:
对end[]节点标记数组进行改动,用二进制下第几位表示即为包含第几个给定子串;
状态转移方程为:dp[i+1][x][k|end[x]]=(dp[i+1][x][k|end[x]]+dp[i][j][k])%mod;(没懂为什么要用‘ | ’ ,等搞明白了在更新吧,,)
dp[i][j][l] 表示长度 i 在第j个结点且当前包含字符串集合为 l 的方案数;
1 #include<bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4
5 const ll mod=20090717;
6 const ll maxn = 111;
7 ll ans=0;
8 ll sum[1100];
9 ll n,m,k;
10
11 struct tire{
12 ll nxt[maxn][30],fail[maxn],end[maxn],tot,root,vis[maxn];
13 ll newNode(){
14 for(ll i=0;i<26;i++) nxt[tot][i] = -1;
15 end[tot++] = 0;
16 return tot-1;
17 }
18 void Init(){
19 tot = 0;
20 root = newNode();
21 memset(dp,0,sizeof(dp));
22 }
23 void Insert(char *buf,ll id){
24 ll len = strlen(buf),i,u = root;
25 for(i=0;i<len;i++){
26 ll x = buf[i]-'a';
27 if(nxt[u][x]==-1) nxt[u][x] = newNode();
28 u = nxt[u][x];
29 }
30 end[u] |= 1<<id;
31 }
32 void build(){
33 queue <ll> q;
34 fail[root] = root;
35 for(ll i=0;i<26;i++){
36 if(nxt[root][i]==-1) nxt[root][i] = root;
37 else{
38 fail[nxt[root][i]] = root;
39 q.push(nxt[root][i]);
40 }
41 }
42 while(!q.empty()){
43 ll now = q.front();
44 q.pop();
45 for(ll i=0;i<26;i++){
46 if(nxt[now][i]==-1) nxt[now][i] = nxt[fail[now]][i];
47 else{
48 fail[nxt[now][i]] = nxt[fail[now]][i];
49 q.push(nxt[now][i]);
50 }
51 }
52 end[now]|=end[fail[now]];
53 }
54 }
55 ll dp[30][111][1<<10];
56 void solve(){
57 dp[0][0][0]=1;
58 for(ll i=0;i<n;i++){
59 for(ll j=0;j<tot;j++){
60 for(ll k=0;k<(1<<m);k++){
61 if(dp[i][j][k]){
62 for(ll u=0;u<26;u++){
63 ll x=nxt[j][u];
64 dp[i+1][x][k|end[x]]+=dp[i][j][k];
65 dp[i+1][x][k|end[x]]%=mod;
66 }
67 }
68 }
69 }
70 }
71 ans=0;
72 for(ll i=0;i<tot;i++){
73 for(ll j=0;j<(1<<m);j++){
74 if(dp[n][i][j]&&sum[j]>=k) ans=(ans+dp[n][i][j])%mod;
75 }
76 }
77 cout<<ans<<endl;
78 }
79 }ac;
80
81 char s1[maxn];
82
83 int main()
84 {
85 for(ll i=0;i<(1<<10);i++){
86 for(ll j=0;j<10;j++){
87 if(i&(1<<j)) sum[i]++;
88 }
89 }
90 while(cin>>n>>m>>k){
91 if(!n&&!m&&!k) break;
92 ac.Init();
93 for(ll i=0;i<m;i++){
94 cin>>s1;
95 ac.Insert(s1,i);
96 }
97 ac.build();
98 ac.solve();
99 }
100 return 0;
101 }
HDU - 2825 Wireless Password (AC自动机+状压DP)的更多相关文章
- hdu2825 Wireless Password(AC自动机+状压dp)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 【HDU2825】Wireless Password (AC自动机+状压DP)
Wireless Password Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u De ...
- HDU2825 Wireless Password —— AC自动机 + 状压DP
题目链接:https://vjudge.net/problem/HDU-2825 Wireless Password Time Limit: 2000/1000 MS (Java/Others) ...
- HDU-2825 Wireless Password(AC自动机+状压DP)
题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...
- hdu 4057--Rescue the Rabbit(AC自动机+状压DP)
题目链接 Problem Description Dr. X is a biologist, who likes rabbits very much and can do everything for ...
- hdu_2825_Wireless Password(AC自动机+状压DP)
题目链接:hdu_2825_Wireless Password 题意: 给你m个串,问长度为n至少含k个串的字符串有多少个 题解: 设dp[i][j][k]表示考虑到长度为i,第j个自动机的节点,含有 ...
- HDU 2825 Wireless Password(AC自动机+DP)
题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 2825 Wireless Password (AC自己主动机,DP)
pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...
随机推荐
- 你还不知道mysql中空值和null值的区别吗?
前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值.以下带来示例给大家进行讲解. 建表 create table tes ...
- 【剑指 Offer】12.矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格. 如果一条路径经过了矩阵的某一格,那么 ...
- http-请求和响应报文的构成
请求的构成: 1)请求方法URI协议/版本 2)请求头(Request Header) 3)请求正文 1)请求方法URI协议/版本 Request URL: http://localhost:8080 ...
- ctfhub技能树—信息泄露—目录遍历
打开靶机 查看页面 点击后发现几个目录 于是开始查找 在2/1目录下发现flag.txt 成功拿到flag 练习一下最近学习的requests库 附上源码 #! /usr/bin/env python ...
- Python输出有颜色的文字
原创链接: https://www.cnblogs.com/easypython/p/9084426.html 我们在使用python运维与开发的过程中,经常需要打印显示各种信息.海量的信息堆砌在 ...
- PAT Advanced 1007 Maximum Subsequence Sum
题目 1007 Maximum Subsequence Sum (25分) Given a sequence of K integers { N1, N2, ..., N**K }. A contin ...
- 推荐几个学习Python的免费网站
想要学好Python,只靠看Python相关的书籍是远远不够的!今天为大家分享几个实用的Python学习网站. 欢迎各位热爱Python的小伙伴进群交流:610380249群里有大佬哦,而且很热心,群 ...
- Py迭代和迭代器,生成器,生产者和消费者模型
迭代器iter 1.迭代的含义: 每次生成的结果依赖于上一次.问路,先问第一个人,第一个人不知道他就说第二个人知道,然后去找第二个人.第二个人不知道就说第三个人知道,然后去找第三个人 2.递归的含义: ...
- Python数据模型与Python对象模型
数据模型==对象模型 Python官方文档说法是"Python数据模型",大多数Python书籍作者说法是"Python对象模型",它们是一个意思,表示&quo ...
- java实现Excel定制导出(基于POI的工具类)
我的需求: 项目中有一些工程表格需要导出,设计到行列合并,定制样式,原有工具类冗余,内聚性强.所以想写一个可以随意定制excel的工具类,工具类满足需求: 对于常用的工程表格有模板格式,可以任意插拔. ...