POJ 1625
什么鬼,真的是有负数的吗?我在字符加上了128才过了。dp[i][j],经过i步到达j状态的路径数。转移很容易了,建个trie图就可以,由前一步可连通到和更新即可。
另外,要用到大数和AC自动机DP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#define LL __int64
using namespace std; const __int64 forward=100000000000000000LL;
const int root=;
const int Maxn=;
int idx[];
struct BigNumber{
LL num[];
void initial(){
for(int i=;i<;i++)
num[i]=;
}
};
BigNumber add_BigNumber(BigNumber a,BigNumber b){
BigNumber c;
c.initial();
for(int i=;i<;i++){
c.num[i]=c.num[i]+a.num[i]+b.num[i];
c.num[i+]=c.num[i]/forward;
c.num[i]%=forward;
}
return c;
}
BigNumber dp[][];
struct Node{
bool tag;
int next[];
int fail;
void initial(){
tag=false;
memset(next,-,sizeof(next));
fail=-;
}
};
int que[Maxn],head,tail,tot;
Node trie[Maxn];
int dictsize,step;
char str[]; void build_ac(){
head=tail=;
que[tail++]=root;
int tmp,p;
while(head!=tail){
tmp=que[head++];
p=-;
for(int i=;i<dictsize;i++){
if(trie[tmp].next[i]!=-){
if(tmp==root) trie[trie[tmp].next[i]].fail=root;
else{
p=trie[tmp].fail;
while(p!=-){
if(trie[p].next[i]!=-){
trie[trie[tmp].next[i]].fail=trie[p].next[i];
break;
}
p=trie[p].fail;
}
if(p==-) trie[trie[tmp].next[i]].fail=root;
}
if(trie[trie[trie[tmp].next[i]].fail].tag)
trie[trie[tmp].next[i]].tag=true;
que[tail++]=trie[tmp].next[i];
}
else{ //trie[tmp].next[i]==-1
if(tmp==root) trie[tmp].next[i]=root;
else{
p=trie[tmp].fail;
while(p!=-){
if(trie[p].next[i]!=-){
trie[tmp].next[i]=trie[p].next[i];
break;
}
p=trie[p].fail;
}
if(p==-) trie[tmp].next[i]=root;
}
}
}
}
} int main(){
int n,m,p,pt;
cin>>n>>m>>p;
for(int i=;i<Maxn;i++) trie[i].initial();
head=tail=tot=;
dictsize=n; step=m;
cin>>str;
for(int i=;i<n;i++)
idx[str[i]+]=i;
// cout<<idx['a']<<endl;
// cout<<idx['b']<<endl;
for(int i=;i<p;i++){
cin>>str;
pt=root;int k=;
int len=strlen(str);
while(k<len){
if(trie[pt].next[idx[str[k]+]]==-) trie[pt].next[idx[str[k]+]]=++tot;
pt=trie[pt].next[idx[str[k]+]];
k++;
}
trie[pt].tag=true;
}
// cout<<"YES"<<endl;
build_ac();
// cout<<"YEA"<<endl;
for(int i=;i<=tot;i++){
for(int j=;j<=step;j++)
dp[i][j].initial();
}
dp[][].num[]=;
for(int k=;k<step;k++){
for(int i=;i<=tot;i++){
if(!trie[i].tag){
for(int j=;j<dictsize;j++){
if(!trie[trie[i].next[j]].tag)
dp[trie[i].next[j]][k+]=add_BigNumber(dp[trie[i].next[j]][k+],dp[i][k]);
}
}
}
}
BigNumber ans;
ans.initial();
// cout<<tot<<endl;
for(int i=;i<=tot;i++){
if(!trie[i].tag){
ans=add_BigNumber(ans,dp[i][step]);
}
}
bool flag=false;
for(int i=;i>=;i--)
if(ans.num[i]>||flag){
if(flag)
printf("%017I64d",ans.num[i]);
else
printf("%I64d",ans.num[i]);
flag=true;
}
if(flag)
printf("%017I64d\n",ans.num[]);
else{
printf("%I64d\n",ans.num[]);
}
return ;
}
POJ 1625的更多相关文章
- POJ 1625 Censored!(AC自动机+高精度+dp)
http://poj.org/problem?id=1625 题意: 给出一些单词,求长度为m的串不包含这些单词的个数. 思路: 这道题和HDU 2243和POJ 2778是一样的,不同的是这道题不取 ...
- POJ 1625 Censored!(AC自动机+DP+高精度)
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 6956 Accepted: 1887 Descrip ...
- POJ 1625 Censored ( Trie图 && DP && 高精度 )
题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 :先构造出 Trie 图方便进行状态转移,这与在 POJ 2278 中 ...
- Match:Censored!(AC自动机+DP+高精度)(POJ 1625)
Censored! 题目大意:给定一些字符,将这些字符组成一个固定长度的字符串,但是字符串不能包含一些禁词,问你有多少种组合方式. 这是一道好题,既然出现了“一些”禁词,那么这题肯定和AC自动机有点 ...
- POJ 1625 Censored!
辣鸡OI毁我青春 Description The alphabet of Freeland consists of exactly N letters. Each sentence of Freela ...
- poj 1625 (AC自动机好模版,大数好模版)
题目 给n个字母,构成长度为m的串,总共有n^m种.给p个字符串,问n^m种字符串中不包含(不是子串)这p个字符串的个数. 将p个不能包含的字符串建立AC自动机,每个结点用val值来标记以当前节点为后 ...
- POJ 1625 Censored!(大数+DP)
题目链接 这题,真心木啥意思,就是数据里貌似字符有负数,注意gets读入.. #include <iostream> #include <cstring> #include & ...
- Censored! - POJ 1625(ac自动机+简单dp+高精度运算)
题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...
- POJ 1625 Censored! [AC自动机 高精度]
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 9793 Accepted: 2686 Descrip ...
- POJ 1625 Censored!(AC自动机->指针版+DP+大数)题解
题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...
随机推荐
- yii引入js文件
作者:zccst 四.在视图层(../views/..)添加CSS文件或JavaScript文件 Yii::app()->clientScript->registerScriptFile( ...
- hdu3853LOOPS(概率与期望dp)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Sub ...
- C#格式化年月日截取
//if (bm.Name == "DateYear") //年 //{ // bm.Select(); ...
- css的外边距合并或者外边距塌陷问题
第一种情况: 已知两个宽和高均为100px,margin均为20px的div垂直排列,现象如下图所示: 当设置css1的margin-bottom:40px:或者css2的margin-top:40p ...
- Android Fragment间的广播消息接收
这种方式不用在配置文件加东西,我比较喜欢. 广播注册,可以写在Activity(onCreate),也可以写在Fragment(onActivityCreated)里. LocalBroadcastM ...
- objectdatasouce的温故
在做ecxel的时候,需要前台做一个联动的效果. 记录一下这个数据源的用法,大学时候用的,忘得差不多了 首先就是往页面拖拽一个objectdatasouce的控件 然后配置数据源: 选择业务对象(其实 ...
- VHDL之FSM
1 Intro The figure shows the block diagram of a single-phase state machine. The lower section contai ...
- 时序分析:DTW算法(基于模板)
对时序对象进行分析,使用KMP算法可以分析速率不变的模式,参考时序分析:欧式空间轨迹模式识别.使用基于模板匹配的方法,对于速率发生变化的模式,需要用新的对速率要求松散的方法,DTW方法为一种广泛使用的 ...
- Windows下VS2013 C++编译测试faster-rcnn
[原创帖!转载请注明出处:http://www.cnblogs.com/LaplaceAkuir/p/6445189.html] 本人最近研究faster-rcnn,在ubuntu成功跑通matlab ...
- [实战经验][SQL Sever 2008 (R)解决方法累积
SQL Sever 2008 (R)的安装图解及配置 http://www.soft6.com/v9/2009/jcsj_1030/115821.html 产品密钥,选择“输入产品密钥”,输入:PTT ...