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[ ...
随机推荐
- 复习--二叉树&&树
树是一种很常用的数据结构,日后的学习中会经常碰到运用树的知识. //构造二叉树#include<cstdio> #include<iostream> #include<a ...
- DCloud-MUI:下拉刷新、上拉加载
ylbtech-DCloud-MUI:下拉刷新.上拉加载 1. 下拉刷新返回顶部 0. http://dev.dcloud.net.cn/mui/pulldown/ 1. 概述 为实现下拉刷新功能,大 ...
- openstack 性能优化极致
- python-day3 元组(tuple),列表(list),字典(dict)
1.元组 tuple 有序数据,元组数据不可更改,若元组中有列表,可更改元组中的列表值里的值 元组中以","分开,若只有一个值就不是元组 包含各种数据类型 索引取值:t(2,0.0 ...
- RabbitMQ 官方NET教程(六)【RPC】
在第二个教程中,我们学习了如何使用Work Queues在多个工作者之间分配耗时的任务. 但是如果我们需要在远程计算机上运行功能并等待结果怎么办? 那是一个不同的模式. 此模式通常称为远程过程调用或R ...
- Go中的main函数和init函数
Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值.虽然一个package里面可以 ...
- 运用<body>属性,渲染页面效果
新建一个HTML5文件,为<body>标签添加样式,代码如下: 01 <!doctype html> 02 <html> 03 <head> 04 &l ...
- C#多线程方法 可传参
//将线程执行的方法和参数都封装到一个类里面.通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数.using System; using System.Threading; //Thre ...
- jQuery顺序加载图片(终版)
这一篇是对上一篇(jQuery顺序加载图片(初版)--http://www.cnblogs.com/newbie-cc/p/3707504.html)的改进. function loadImage(i ...
- HDU_5724_状态压缩的sg函数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5724 题目大意:n行20列的棋盘,对于每行,如果当前棋子右边没棋子,那可以直接放到右边,如果有就跳过放 ...