题目地址
先把病毒串丢进ac自动机里面。
dp[i][j]表示长度为i的从trie图的根节点到j满足条件的串的数量。
因为答案很大,要用到高精度。
注意的是建图的时候,ed[u] |= ed[f[u]],如果失配指针的位置是病毒的话那么u也不能匹配。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 1e5+5;
struct BigInter {private:int num[50], len;int base;
public:     BigInter() {memset(num,0,sizeof(num));len = 1;base = 10000;}BigInter(int v) {memset(num,0,sizeof(num));base = 10000;len = 0;do {num[++len] = v%base;v /= base;}while(v);}BigInter operator=(int x) {return *this = BigInter(x);}BigInter operator=(long long x) {return *this = BigInter(x);}BigInter operator+(BigInter &b) {BigInter res;res.len = max(this->len, b.len);for(int i = 1; i <= res.len; i++) {res.num[i] += this->num[i] + b.num[i];res.num[i+1] += res.num[i]/base;res.num[i] = res.num[i]%base;}if(res.num[res.len+1]) res.len++;return res;}BigInter operator+(long long x) {BigInter res;BigInter b = BigInter(x);res.len = max(this->len, b.len);for(int i = 1; i <= res.len; i++) {res.num[i] += this->num[i] + b.num[i];res.num[i+1] += res.num[i]/base;res.num[i] = res.num[i]%base;}if(res.num[res.len+1]) res.len++;return res;}BigInter operator*(BigInter &b) {BigInter res;res.len = this->len+b.len;for(int i = 1; i <= this->len; i++) {for(int j = 1; j <= b.len; j++) {res.num[j+i-1] += this->num[i] * b.num[j];res.num[j+i] += res.num[j+i-1]/base;res.num[j+i-1] %= base;}}while(!res.num[res.len]) res.len--;return res;}BigInter operator*(long long x) {BigInter res;BigInter b(x);res.len = this->len+b.len;for(int i = 1; i <= this->len; i++) {for(int j = 1; j <= b.len; j++) {res.num[j+i-1] += this->num[i] * b.num[j];res.num[j+i] += res.num[j+i-1]/base;res.num[j+i-1] %= base;}}while(!res.num[res.len]) res.len--;return res;}void operator +=(BigInter &b) {*this = *this + b;}void operator *=(BigInter &b) {*this = *this * b;}void operator +=(long long x) {BigInter b = BigInter(x);*this = *this + b;}void operator *=(long long x) {BigInter b = BigInter(x);*this = *this * b;}BigInter operator++() {*this = *this+1;return *this;}BigInter operator ++(int) {BigInter old = *this;++(*this);return old;}void print() {printf("%d", num[len]);for(int i = len-1; i >= 1; i--) {printf("%04d", this->num[i]);}puts("");}
}dp[105][305];
int indx[5005];
struct node{int nex[maxn][305], tot, root;int f[maxn], ed[maxn];int newnode() {for(int i = 0; i < 300; i++) {nex[tot][i] = -1;}ed[tot] = 0;return tot++;}void init() {tot = 0;root = newnode();}void insert(char *s) {int len = strlen(s), u = root;for(int i = 0; i < len; i++) {int ch = indx[s[i]+100];if(nex[u][ch] == -1) nex[u][ch] = newnode();u = nex[u][ch];}ed[u] = 1;}void getfail() {queue<int>Q;f[root] = root;for(int i = 0; i < 300; i++) {if(nex[root][i] == -1) nex[root][i] = root;else {f[nex[root][i]] = root;Q.push(nex[root][i]);}}while(!Q.empty()) {int u = Q.front();Q.pop();ed[u] |= ed[f[u]];for(int i = 0; i < 300; i++) {if(nex[u][i] == -1) nex[u][i] = nex[f[u]][i];else {f[nex[u][i]] = nex[f[u]][i];Q.push(nex[u][i]);}}}}void query(int m, int n) {dp[0][0] = 1;for(int i = 1; i <= m; i++) {for(int j = 0; j < tot; j++) {if(ed[j] == 1) continue;for(int k = 0; k < n; k++) {if(ed[nex[j][k]] != 1) {dp[i][nex[j][k]] += dp[i-1][j];}}}}BigInter res;for(int i = 0; i < tot; i++) res = res + dp[m][i];res.print();}
}ac;
char ss[maxn];
int main() {int n, m, p;scanf("%d%d%d", &n, &m, &p);scanf("%s", ss);ac.init();int len = strlen(ss);for(int i = 0; i < len; i++) indx[ss[i]+100] = i;for(int i = 1; i <= p; i++) {scanf("%s", ss);ac.insert(ss);}ac.getfail();ac.query(m, n);
}

poj-1625 Censored![ac自动机+dp+高精度]相关推荐

  1. POJ - 1625 Censored!(AC自动机+dp+高精度运算)

    题目链接:点击查看 题目大意:给出一个含有 n 个不同字符的字符集,接着规定所有单词的长度为 m ,再给出 k 个病毒串,问有多少个字符串中不含有病毒串 题目分析:这个题目和之前做过的DNA的那个题有 ...

  2. Censored! POJ - 1625(AC自动机 + dp +高精度模板)

    题目链接 题目大意:给你一个字母表,给定一些敏感字符串,问长度为m且不含任意敏感字符串的串有多少个.(字符全部来自字母表) 思路:首先第一个坑点是输入的字符是unsigned char,可能出现负的A ...

  3. POJ 1625 Censored ( Trie图 DP 高精度 )

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...

  4. [POJ 1625] Censored! (AC自动机+DP+高精度)

    链接 POJ 1625 题意 给出P个模式串,问长度为M且不含有P中任何一个为子串的字符串有多少种. 给出了大小为N的一个字符集,属于ASCII但不一定为英文字母. 最终答案不进行取模,所以可能非常大 ...

  5. Censored! :ac自动机 + DP

    分析 如果字符串的长度大一点可以用矩阵快速幂来做,因为数据范围比较小,可以用DP来代替 我们去枚举每一位在a自动机中的位置,再去枚举下一位的位置,判断是否打过标记,然后进行状态转移 需要注意的是,如果 ...

  6. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  7. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  8. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  9. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

最新文章

  1. react ui框架 移动端_你必须要知道的移动端UI组件设计宝典
  2. html5 本地保存大数据库,HTML5本地储存 - jellydd的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. python图像处理模糊_Python+OpenCV图像处理之模糊操作
  4. DatagridView 常用功能代码
  5. 开发用的一些工具(更新中)
  6. 【ElasticSearch】Es 源码之 ResponseCollectorService 源码解读
  7. CB Insights发布AI行业25大趋势:中国人脸识别、无人商店发展迅速
  8. hihoCoder-1000-A+B
  9. 客户端无法远程连接服务器的问题
  10. 天选3安装Linux的一些问题及解决方案
  11. 2005-10-22 风波
  12. STM32H743 USART1 LL 库
  13. 签名服务器支付系统,基于短签名的电子银行支付认证系统设计与实现
  14. CentOS配置Jenkins+Android+fir+pyger(蒲公英)+qiniu(七牛)
  15. SAP开发框架系列之 自定义单据
  16. java中sha1解密_SHA1解密
  17. Flink 相关操作
  18. Java使劲浪费内存-List查询一千万条数据重复次数
  19. 输入的英文字母隔得很开
  20. 服务器设置header返回信息,http服务器header返回时间问题

热门文章

  1. 泉州有了一个水务大脑,用AI守护“绿水青山”
  2. 康考迪亚大学应用计算机科学,康考迪亚大学.pdf
  3. 一招判断云主机IP是不是原生IP
  4. mfc中插入PNG透明图片
  5. T1005: 地球人口承载力估计(信息学一本通C++)
  6. 苏宁回应股权质押给淘宝;日本政府用 AI 帮民众找对象;魅族回应 “暗中给手机植入木马” | EA周报...
  7. win server 2016 无法安转.net framework 3.5 问题
  8. kubernetes故障现场一之Orphaned pod
  9. [SPRD] Q 版本开机 logo 显示原理
  10. Java kafka producer 的常用参数的意义说明及默认值