POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个。
依然是水水的AC自动机+DP。。做完后发现居然和POJ2778是一道题,回过头来看都水水的。。。
- dp[i][j]表示长度i(在自动机转移i步)且后缀状态为自动机第j个结点的合法字符串数
- dp[0][0]=1
- 转移转移。。。
注意要用高精度,因为答案最多5050。
还有就是要用unsigned char,题目的输入居然有拓展的ASCII码,编码128-255。
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int tn,ch[][],fail[],flag[];
void insert(unsigned char *s){
int x=;
for(int i=; s[i]; ++i){
int y=s[i];
if(ch[x][y]==) ch[x][y]=++tn;
x=ch[x][y];
}
flag[x]=;
}
void init(){
memset(fail,,sizeof(fail));
queue<int> que;
for(int i=; i<; ++i){
if(ch[][i]) que.push(ch[][i]);
}
while(!que.empty()){
int x=que.front(); que.pop();
for(int i=; i<; ++i){
if(ch[x][i]) que.push(ch[x][i]),fail[ch[x][i]]=ch[fail[x]][i],flag[ch[x][i]]|=flag[ch[fail[x]][i]];
else ch[x][i]=ch[fail[x]][i];
}
}
}
#define ULL unsigned long long
#define M 1000000000000000000L
struct BigInt{
ULL bit[];
BigInt(int a=){
bit[]=bit[]=bit[]=bit[]=;
bit[]=a;
}
};
BigInt operator+(const BigInt &b1,const BigInt &b2){
BigInt b;
ULL carry=;
for(int i=; i>=; --i){
ULL tmp=b1.bit[i]+b2.bit[i]+carry;
b.bit[i]=tmp%M;
carry=tmp/M;
}
return b;
};
void output(const BigInt &b){
int i=;
while(i< && b.bit[i]==) ++i;
if(i==){
puts("");
return;
}
printf("%llu",b.bit[i]);
for(int j=i+; j<; ++j){
printf("%018llu",b.bit[j]);
}
putchar('\n');
}
int main(){
BigInt one();
unsigned char str[];
int n,m,p;
while(~scanf("%d%d%d",&n,&m,&p)){
scanf("%s",str);
bool vis[]={};
for(int i=; str[i]; ++i) vis[str[i]]=;
tn=;
memset(ch,,sizeof(ch));
memset(flag,,sizeof(flag));
for(int i=; i<p; ++i){
scanf("%s",str);
insert(str);
}
init();
BigInt **d=new BigInt*[m+];
for(int i=; i<=m; ++i) d[i]=new BigInt[tn+];
d[][]=one;
for(int i=; i<m; ++i){
for(int j=; j<=tn; ++j){
if(flag[j]) continue;
for(int k=; k<; ++k){
if(!vis[k] || flag[ch[j][k]]) continue;
d[i+][ch[j][k]]=d[i+][ch[j][k]]+d[i][j];
}
}
}
BigInt res=;
for(int i=; i<=tn; ++i) res=res+d[m][i];
output(res);
for(int i=; i<=m; ++i) delete[] d[i];
delete[] d;
}
return ;
}
POJ1625 Censored!(AC自动机+DP)的更多相关文章
- POJ1625 Censored! —— AC自动机 + DP + 大数
题目链接:https://vjudge.net/problem/POJ-1625 Censored! Time Limit: 5000MS Memory Limit: 10000K Total S ...
- [POJ1625]Censored!(AC自动机+DP+高精度)
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10824 Accepted: 2966 Descri ...
- Match:Censored!(AC自动机+DP+高精度)(POJ 1625)
Censored! 题目大意:给定一些字符,将这些字符组成一个固定长度的字符串,但是字符串不能包含一些禁词,问你有多少种组合方式. 这是一道好题,既然出现了“一些”禁词,那么这题肯定和AC自动机有点 ...
- POJ 1625 Censored!(AC自动机+DP+高精度)
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 6956 Accepted: 1887 Descrip ...
- 对AC自动机+DP题的一些汇总与一丝总结 (2)
POJ 2778 DNA Sequence (1)题意 : 给出m个病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 关键字眼:不包含,个数,长度 DP[i][j] : 表示长 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
- hdu 2457(ac自动机+dp)
题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...
随机推荐
- IOS项目删除Git
默认创建工程会在MAC上面创建Git版本管理, 但是呢, 我现在想上传到svn服务器进行管理, 但是已经有个git 好像上传不了 只有把Git删了才能继续. 连问带查, 终于找到解决方案 把 .git ...
- Autolayout及VFL经验分享
http://www.cocoachina.com/industry/20131108/7322.html 这篇不是什么教程.Cocoa autolayout出来蛮久了.以前多次想去深入研究一下,每次 ...
- linux下vim命令详解 转自: zhanglong0426
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx 开始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的 ...
- FastCgi与PHP-fpm之间是个什么样的关系
刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少. 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. ...
- iOS7 中的JavaScriptCore简单介绍
以前写过一篇介绍如何使用第三方库在ios上进行js和oc交互调用的文章,链接如下 iOS 使用UIWebView把oc代码和javascript相关联.当时建立项目时,仍然是ios6时代,所以没有原生 ...
- 【好用的小技巧】win8兼容、网页不让复制
1.今天下了个matlab7,我用的是win8系统,不兼容. 解决:鼠标右键matlab7的快捷键,点击属性,选择兼容性,选择window vista即可运行 2.在一个 网页上看到一个对自己很有帮助 ...
- 【USACO】namenum
//开始傻×了 受题目形容的误导 一心想生成所有可能的 字符串组合 之后查找非常慢 //听了同学的 将5000个dict里的字符串 转换成char型数组(不能直接用int 会越界)直接用输入的数据对着 ...
- HDU 5651 xiaoxin juju needs help (组合数)
xiaoxin juju needs helpTime Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64uSu ...
- ubuntu下常用服务器的构建
1 ftp 1.1 ftp服务器 1.安装vsftpd服务器 sudo apt-get install vsftpd 2.配置vsftpd.conf文件 sudo vi /etc/vsftpd.con ...
- LeetCode之LRU Cache 最近最少使用算法 缓存设计
设计并实现最近最久未使用(Least Recently Used)缓存. 题目描述: Design and implement a data structure for Least Recently ...