题意,,,给你 M 个字符去组成密码,密码的长度规定为 N,所组成的密码要求至少 含有 M 个字符里面的 K 个,字符可能包含,不能重复计算;

这个    有点难度;因为  M 很小,所以,可以用二进制来做,当然  内存可能会爆,如果不注意好的话; 上题是要不包含字符,而这题是要求包含字符,那么对应的每一个状态是不是又多了一维变量,每个状态包含了多少个字符,从 1~k --》

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define mod 20090717
using namespace std;struct date
{date *next[26],*fail;int in,cnt;
}tree[1221],*que[1221],*root;
int N,M,P,tail,head,total;
char dir[20][20];date *creat_node( )
{for( int i = 0; i < 26; i++ )tree[total].next[i] = NULL;tree[total].fail    = NULL;tree[total].in = total;tree[total].cnt = 0;return &tree[total++];
}void inint( )
{tail = head = total = 0;root = creat_node();root->fail = root;
}void insert( char *word,int i )
{date *temp = root;while( *word ){int k = *word - 'a';if( temp->next[k] == NULL )temp->next[k] = creat_node();temp = temp->next[k];word++;}temp->cnt |= (1<<i);
}void build_AC( )
{que[tail++] = root;while( tail > head ){date *temp = que[head++];for( int i = 0; i < 26; i++ )if( temp->next[i] ){if( temp == root ) temp->next[i]->fail = root;else               temp->next[i]->fail = temp->fail->next[i];temp->next[i]->cnt = temp->next[i]->cnt|temp->fail->next[i]->cnt|temp->cnt;que[tail++] = temp->next[i];}else {if( temp == root ) temp->next[i] = root;else               temp->next[i] = temp->fail->next[i];}}
}int map[1500];
void work( )
{for( int i = 0; i <= 1500; i++ )map[i] = map[i>>1] + (i&1);
}int  dp[27][121][1500];
void DP( )
{int i,j,k,l,pos,res;pos = (1<<M );for (i = 0; i <= N; ++i)  for (j = 0; j < total; ++j)  for (k = 0; k < (1<<M); ++k)  dp[i][j][k] = 0;  dp[0][0][0] = 1;for( i = 1; i <= N;   i++ )for( j = 0; j <total; j++ )for( k = 0; k < pos;  k++ ){if( dp[i-1][j][k] == 0 ) continue;int a = dp[i-1][j][k];for( l = 0; l <  26;  l++ ){int b = tree[j].next[l]->in;int c = tree[j].next[l]->cnt;dp[i][b][k|c] = ( a + dp[i][b][k|c] )%mod;}}res = 0; for( i = 0; i <  total; i++ )for( j = 0; j <  pos; j++ )if( map[j] >= P )res = ( res + dp[N][i][j] )%mod;printf("%d\n",res);
}int main( )
{work();while( scanf("%d%d%d",&N,&M,&P) != EOF ){if( N+M+P == 0 )break;inint();for( int i = 0; i < M; i++ )scanf("%s",&dir[i]),insert( dir[i],i );build_AC( );DP( );}return 0;
}

转载于:https://www.cnblogs.com/wulangzhou/archive/2013/04/12/3016746.html

HDU 2825 位压缩相关推荐

  1. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  2. hdu 4012(bfs+位压缩)

    转载标记处:http://blog.csdn.net/kalilili/article/details/43560257 思路:每次涂色以后必有一个格子的颜色是最终的颜色,否则这次涂色根本没意义,所以 ...

  3. 22位压缩版UUID

    package com.lym.order.util;import javax.xml.crypto.Data; import java.util.Base64; import java.util.D ...

  4. 高精度4位压缩法原理与实现

    我们都知道 int类型占32bit 可表示范围: [-2147483648,2147483647] long long类型 64bit可表示范围:[-9223372036854775808,92233 ...

  5. HDU 3220 Alice’s Cube (09年上海区域赛水题(位压缩、逆向搜索、打表))

    这道题是09年上海区域赛的A题,虽然很水,但是不能直接爆搜,直接爆搜要T.于是我们看到题目的要求是说当操作的步数大于3的时候就输出more,那么我们可以从终态枚举进行了三次操作所能达到的所有状态,这个 ...

  6. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  7. POJ1753 棋盘翻转(位压缩+广度优先搜索)

    http://poj.org/problem?id=1753 题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四 ...

  8. HDU 1565 状态压缩

    题意: 你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大.(n <= 20 ...

  9. hdu 1044 BFS(压缩图)+DFS

    题意:              给你起点,终点,图上有墙有路还有宝物,问你在规定时间内能否能到终点,如果能问最多能捡到多少宝物. 思路:           看完这个题目果断 BFS+三维的mark ...

  10. HDU 1693(状态压缩 插头DP)

    我们引用国家队2008年陈丹琦的大作--<基于连通性状态压缩的动态规划问题>,上面对于插头.轮廓线的概念有详细的解释,不再赘述. 我们使用一个三维数组,前两维表示所在的格子,后一维表示轮廓 ...

最新文章

  1. MiniGUI - UNIX Domain Socket 封装
  2. 爱国者强烈推荐:nanopiR1——你懂的功能,懂你的开发板
  3. 主键、唯一键与唯一索引的区别
  4. Ubuntu LXC
  5. javascript :得到上星期的这一天日期
  6. 汇总jQuery的61种选择器及示例
  7. 使用durid的ConfigFilter对数据库密码加密
  8. 以相关组为基础的3D物体识别
  9. php 获取数据库函数吗,如何正确理解PHP获取显示数据库数据函数
  10. Hessian Matrix
  11. ubuntu学习日记--Lesson6:shell,bash,dash
  12. 数据挖掘10大算法(1)——PageRank
  13. HDU 1864 最大报销额(01背包)
  14. CentOS hgfs中没有共享文件夹
  15. python设计棋牌游戏
  16. 推荐几款屏幕录制工具(可录制GIF)
  17. 高通骁龙888开始被Linux内核5.12版正式支持
  18. 榜样的力量——清华大学大数据软件团队2020年度先进个人风采展示
  19. 音频信号处理——DTW
  20. c4d打开没反应_PS、AI、PR、AE、C4D零基础自学经验分享

热门文章

  1. 文件系统读写Linux文件系统损坏的修复技术Strut2教程-java教程
  2. DHTML【10】--Javascript
  3. anywhere随启随用的静态文件服务器
  4. redhat初始化yum源,使用阿里云yum源
  5. asp.net MVC Views-----Controller传递数据方法
  6. STM32学习笔记(十) CAN通讯测试(环回模式)
  7. 安卓奇葩问题之:返回按键监听,使Dialog不消失
  8. Java Script基础(一)
  9. java的几种对象(PO,VO,DAO,BO,POJO)解释(转)
  10. Javascript经典窍门