什么鬼,真的是有负数的吗?我在字符加上了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的更多相关文章

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

    http://poj.org/problem?id=1625 题意: 给出一些单词,求长度为m的串不包含这些单词的个数. 思路: 这道题和HDU 2243和POJ 2778是一样的,不同的是这道题不取 ...

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

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 6956   Accepted: 1887 Descrip ...

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

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 :先构造出 Trie 图方便进行状态转移,这与在 POJ 2278 中 ...

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

     Censored! 题目大意:给定一些字符,将这些字符组成一个固定长度的字符串,但是字符串不能包含一些禁词,问你有多少种组合方式. 这是一道好题,既然出现了“一些”禁词,那么这题肯定和AC自动机有点 ...

  5. POJ 1625 Censored!

    辣鸡OI毁我青春 Description The alphabet of Freeland consists of exactly N letters. Each sentence of Freela ...

  6. poj 1625 (AC自动机好模版,大数好模版)

    题目 给n个字母,构成长度为m的串,总共有n^m种.给p个字符串,问n^m种字符串中不包含(不是子串)这p个字符串的个数. 将p个不能包含的字符串建立AC自动机,每个结点用val值来标记以当前节点为后 ...

  7. POJ 1625 Censored!(大数+DP)

    题目链接 这题,真心木啥意思,就是数据里貌似字符有负数,注意gets读入.. #include <iostream> #include <cstring> #include & ...

  8. Censored! - POJ 1625(ac自动机+简单dp+高精度运算)

    题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...

  9. POJ 1625 Censored! [AC自动机 高精度]

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9793   Accepted: 2686 Descrip ...

  10. POJ 1625 Censored!(AC自动机->指针版+DP+大数)题解

    题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...

随机推荐

  1. [python 基础]python装饰器(二)带参数的装饰器以及inspect.getcallargs分析

    带参数的装饰器理解无非记住两点: 1.本质不过在基本的装饰器外面再封装一层带参数的函数 2.在使用装饰器语法糖的时候与普通装饰器不同,必须要加()调用,且()内的内容可以省略(当省略时,admin默认 ...

  2. 洛谷 P3112 后卫马克 —— 状压DP

    题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...

  3. Building a Space Station(bfs)

    http://poj.org/problem?id=2031 题意:给出n个球的圆心坐标x,y,z, 半径r,若任意两球不相交,则在两球间建桥.问需建桥的最短距离是多少. 思路:建图,以两球间相差的距 ...

  4. Drainage Ditches(网络流(EK算法))

    计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...

  5. selenium3 + python - select定位

    一.Select模块(index)     1.导入Select模块.直接根据属性或索引定位     2.先要导入select方法:from selenium.webdriver.support.se ...

  6. getField();在TP5里成什么了?

    拆分为value和column了 $comps=db("company")->where(array("areaid"=>$areaid))-> ...

  7. Hbuilder 移动app

    ==========代码行快捷方法========== div*4div[class=""]*4div[id=""]*4 tr*4tr{<div>w ...

  8. BZOJ 3681 线段树合并+网络流

    思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...

  9. RabbitMQ 官方NET教程(二)【工作队列】

    这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务和避免必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送 ...

  10. 【转】js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...