什么鬼,真的是有负数的吗?我在字符加上了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. HTTP服务端JSON服务端

    HTTP服务端JSON服务端 最后更新日期:  2014-5-18 Author: Kagula 阅读前提: CMake工具的基本使用 内容简介: CPPCMS是个开源Web开发框架,通过它可以很容易 ...

  2. vs code golang代码自动补全

    “go.useCodeSnippetsOnFunctionSuggest”: true 文件-->首选项--->设置--->用户设置 添加下行:然后就可以自动补全了,包括() “go ...

  3. 3个不常用的HTML标签

    html标签众多,在HTML手册里你可以都查到.但有的HTML标签你可能从未使用过.不是因为你欠缺学习精神,而是它们确实用处不大.如果你有探索精神,那就接着往下看吧. 第一个:<abbr> ...

  4. Python迭代器(斐波拉切数列实例)

    将一个容器通过iter()函数处理后,就变成了迭代器.迭代器有2个魔法方法__iter__.__next__,一个迭代器必须实现__iter__,这个方法实际上是返回迭代器本身(return self ...

  5. ROS-URDF-Gazebo

    前言:在gazebo里运行urdf文件 一.安装教程包 cd ~/catkin_test/srcgit clone https://github.com/ros/urdf_sim_tutorial.g ...

  6. sql 添加列并设置默认值

    ALTER TABLE tablsename ADD fieldname BIT NULL DEFAULT

  7. 开启远程MySQL

    安装完MySQL,由于安全原因默认是没有赋予用户远程权限的,所以第一步要首先赋予用户对应的权限 一  授权 mysql> mysql -u用户名 [-pIp地址] -p #登录 mysql> ...

  8. 5.14web相关概念

    1.软件架构 1.C/S:客户端/服务器端 2.B/S:浏览器/服务器端 2.资源分类 1.静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析如:html,cs ...

  9. SQLServer2008 有用的判断函数

    ISNULL(参数1,参数2) 若参数1为空,则返回参数2 NULLIF(参数1,参数2) 若参数1和参数2不等,则返回参数1 若参数1和参数2相等,则返回NULL 例子:ISNULL(NULLIF( ...

  10. AFN请求后台返回数据为NSInlineData类型的处理

    在利用AFN进行数据解析时出现返回数据为 <7b227374 61747573 223a302c 226d6573 73616765 223a22e6 82a8e79a 84e6898b e69 ...