什么鬼,真的是有负数的吗?我在字符加上了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. 实现泛型IEnumerable接口

    用C#实现一个类的IEnumerable接口时有两种方法:1)实现非泛型IEnumerable接口:2)实现泛型IEnumerable(T)接口.如果采用方法1,当集合元素T是值类型时,将涉及到巨多的 ...

  2. C语言程序判断文件夹是否存在

    #include <stdio.h> #include <io.h> int main(void){ if ( !access("C://Users/hui" ...

  3. selenium3+python-多窗口、句柄(handle)

    一.获取当前窗口句柄 1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别. 2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换.但是脚本没长眼 ...

  4. BZOJ 1407 exgcd

    思路: 数据范围不大.. 那我们就枚举M好了.. 再两两判断一下有没有冲突 怎么判断呢? exgcd!!! p[i]*k+c[i]=p[j]*k+c[j]  (mod m) (p[j]-p[i])*k ...

  5. [转]Oracle 存储过程语法

    转自:http://www.cnblogs.com/chuncn/archive/2009/04/29/1381282.html 存储过程 1  CREATE OR REPLACE PROCEDURE ...

  6. buf.readInt16LE函数详解

    offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readInt16BE() 返回一个较大 ...

  7. (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:  List list = new ArrayList();  list.add(“Hello”);  list.add(“World”);  list.add(“Learn”); //此时list 为Hello World Learn  rever

    import java.util.ArrayList; import java.util.List; public class AA { public static void main(String[ ...

  8. Vs工程高版本向低版本迁移

    使用到一个SLAM程序,一些运行库是基于PCL1.7.2Vs11版本,但是Vs11巨慢,应该把程序迁移到Vs10 下面,遇到打不开的问题. 1.修改方法: 参考链接:使用低版本打开高版本VS解决方案 ...

  9. 【sqli-labs】 less11 POST - Error Based - Single quotes- String (基于错误的POST单引号字符型注入)

    查看源码,用户名和密码通过post提交 加单引号提交 出现报错,推测对应的SQL语句 , 直接使用or构造永真登录 成功,注意此处登录的用户为表中的第一个用户 需要改变用户可以通过改变筛选条件实现 作 ...

  10. gitlab变更邮箱后发送邮件报SSLError错误

    测试发送邮件: gitlab-rails console Notify.test_email('test666@example.com', 'Message Subject', 'Message Bo ...