当前位置: 首页 > 编程日记 > 正文

poj1625Censored!(AC自动机+dp)

链接

第一次做这种题目,参考了下题解,相当于把树扯直了做DP,估计这一类题都是这个套路吧。

状态方程dp[i][next] = dp[i][next]+dp[i][j] ;dp[i][j]表示长度为i的第J个结点的时候满足题意的num,next为当前j点所能走到的下一个合法的结点。

需要用高精度,看到一些规范的高精度写法,觉得不错,有空整理下来。

不知道是不是我理解错了,按理说字符串病毒长度不应超过10.。但开到55依旧RE,开550AC。。。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 110
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 const int child_num = 110;
 18 const int BASE = 10000;
 19 const int DIG = 4;
 20 char s[N*100],vir[550];
 21 int id[2024];
 22 struct bignum
 23 {
 24      int a[110],len;
 25      bignum()
 26      {
 27          memset(a,0,sizeof(a));
 28          len = 1;
 29      }
 30      bignum(int v)
 31      {
 32          memset(a,0,sizeof(a));
 33          len = 0;
 34          do
 35          {
 36              a[len++] = v%BASE;
 37              v/=BASE;
 38          }while(v);
 39      }
 40      /*bignum(const char s[])
 41      {
 42          memset(a,0,sizeof(a));
 43          int k = strlen(s);
 44          len = k/DIG;
 45          if(k%DIG) len++;
 46          int cnt = 0;
 47          for(int i = k-1;  i >= 0 ; i-=DIG)
 48          {
 49              int t = 0;
 50              int kk = i-DIG+1;
 51              if(kk<0) kk =0;
 52              for(int j = kk ; j <= i ; j++)
 53              t = t*10+s[j]-'0';
 54              a[cnt++] = t;
 55          }
 56      }*/
 57      bignum operator + (const bignum &b)const
 58      {
 59          bignum res;
 60          res.len = max(len,b.len);
 61          int i;
 62          for(i = 0 ; i < res.len ;i ++)
 63          res.a[i] = 0;
 64          for(i = 0 ; i < res.len ; i++)
 65          {
 66              res.a[i] += ((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0);
 67              res.a[i+1] += res.a[i]/BASE;
 68              res.a[i] = res.a[i]%BASE;
 69          }
 70          if(res.a[res.len]>0) res.len++;
 71          return res;
 72      }
 73      void output()
 74      {
 75          printf("%d",a[len-1]);
 76          for(int i = len-2 ; i >=0 ; i--)
 77          printf("%04d",a[i]);
 78          printf("\n");
 79      }
 80 }dp[110][110];
 81 class AC
 82 {
 83     private:
 84     int ch[N][child_num];
 85     int Q[N];
 86     int val[N];
 87     int fail[N];
 88     //int id[N];
 89     int sz;
 90     public :
 91     void init()
 92     {
 93         fail[0] = 0;
 94         //for(int i = 0 ;i < child_num-32 ; i++)
 95         //id[i+32] = i;
 96     }
 97     void reset()
 98     {
 99         memset(val,0,sizeof(val));
100         memset(fail,0,sizeof(fail));
101         memset(ch[0],0,sizeof(ch[0]));
102         sz = 1;
103     }
104     void insert(char *a,int key)
105     {
106         int k = strlen(a),p = 0;
107         for(int i = 0 ; i < k ;i++)
108         {
109             int d = id[a[i]];
110             if(ch[p][d]==0)
111             {
112                 memset(ch[sz],0,sizeof(ch[sz]));
113                 ch[p][d] = sz++;
114             }
115             p = ch[p][d];
116         }
117         val[p] = key;
118     }
119     void construct(int n)
120     {
121         int i,head=0,tail = 0;
122         for(i = 0; i < n ; i++)
123         {
124             if(ch[0][i])
125             {
126                 Q[tail++] = ch[0][i];
127                 fail[ch[0][i]] = 0;
128             }
129         }
130         while(head!=tail)
131         {
132             int u = Q[head++];
133             val[u]|=val[fail[u]];
134             for(i = 0 ; i < n ; i++)
135             {
136                 if(ch[u][i])
137                 {
138                     Q[tail++] = ch[u][i];
139                     fail[ch[u][i]] = ch[fail[u]][i];
140                 }
141                 else ch[u][i] = ch[fail[u]][i];
142             }
143         }
144     }
145     void work(int m,int n)
146     {
147         int i,j,g;
148         for(i = 1; i <= m ;i++)
149             for(j = 0 ;j <= sz; j++)
150             dp[i][j] = bignum(0);
151         dp[0][0] = bignum(1);
152         for(i = 0 ; i < m ;i++)
153         {
154             for(j = 0 ; j < sz ;j++)
155             for(g = 0 ; g < n ; g++)
156             if(!val[ch[j][g]])
157             {
158                 dp[i+1][ch[j][g]]=dp[i+1][ch[j][g]]+dp[i][j];
159             }
160         }
161         bignum ans = bignum(0);
162         for(j = 0 ;j < sz ; j++)
163         ans=ans+dp[m][j];
164         ans.output();
165     }
166 }ac;
167 int main()
168 {
169     int n,m,i,p;
170     ac.init();
171     while(cin>>n>>m>>p)
172     {
173         cin>>s;
174         for(i = 0 ; i < n; i++)
175         id[s[i]] = i;
176         ac.reset();
177         for(i = 1;i <= p; i++)
178         {
179             scanf("%s",vir);
180             ac.insert(vir,1);
181         }
182         ac.construct(n);
183         ac.work(m,n);
184     }
185     return 0;
186 }
View Code

转载于:https://www.cnblogs.com/shangyu/p/3730815.html

相关文章:

图解5G NR帧结构

子载波间隔 与LTE&#xff08;子载波间隔和符号长度&#xff09;相比&#xff0c; NR支持多种子载波间隔&#xff08;在LTE中&#xff0c;只有15 Khz这种子载波间隔&#xff09;。 在3GPP38.211中&#xff0c;有关于NR子载波间隔类型的总结。 具体的子载波间隔类型如下图所示&a…

(C++) A+B 输入输出练习IV 每行的第一个数N,表示本行后面有N个数。 如果N=0时,表示输入结束,且这一行不要计算。

#include<cstdio>/* 4 1 2 3 4 5 1 2 3 4 5 0 */int main(){int n,a;while(scanf("%d",&n),n){int sum 0;for(int i 0;i<n;i){scanf("%d",&a);sum a;}printf("%d\n",sum); }return 0;}

jQuery与其它库冲突的解决方法(转)

原文出处&#xff1a;http://www.jb51.net/article/24014.htm 在jQuery库中&#xff0c;几乎所有的插件都被限制在它的命名空间里。全局的对象都很好地存储在jQuery命名空间里&#xff0c;因此当把jQuery和其它javascript类库一起使用时&#xff0c;不会引起冲突. (注意&#x…

ASP.NET 下载文件方式

protected void Button1_Click(object sender, EventArgs e){/*微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。代码如下&#xff1a;*/Response.ContentType "a…

ITIL管理思想的执行工具发布

E8.HelpDesk是融入ITIL管理思想&#xff0c;并结合中国企业实施ITIL的实际需求&#xff0c;成功研发ITIL管理思想的执行工具&#xff0c;全面帮助中国企业高效导入ITIL管理体系&#xff0c;提升企业战略执行力。 E8.HelpDesk支持多种服务台管理体系&#xff0c;支持事件管理、问…

(C++)A+B 输入输出练习V 输入的第一行是一个正数N,表示后面有N行。每一行的第一个数是M,表示本行后面还有M个数。

#include<cstdio>/* 2 4 1 2 3 4 5 1 2 3 4 5 */int main(){int n,a;scanf("%d",&n);while(n--){int sum 0,m;scanf("%d",&m);for(int i 0;i<m;i){scanf("%d",&a);sum a;}printf("%d\n",sum); }return 0;}

Linux上重启服务的正确命令

在开发环境下&#xff0c;我们经常需要部署代码&#xff0c;重启服务&#xff0c;所以会把命令写在脚本中&#xff0c;方便使用。 我们可能这么写 #!/bin/bashps -ef | grep backend-api-1.0 | grep -v "\-\-color" |awk {print $2} |xargs kill -9 sleep 1 nohup ja…

Error: Most middleware (like bodyParser) ...

运行NodeJS时出现如下错误&#xff1a; Error: Most middleware (like bodyParser) is no longer bundled with Express and must be installed separately. 意思是 命令行中运行 npm install body-parser 回车&#xff0c;进行安装。 对源代码进行调整&#xff0c;加上 var b…

[导入][转]常用CSS缩写语法总结

使用缩写可以帮助减少你CSS文件的大小&#xff0c;更加容易阅读。css缩写的主要规则如下&#xff1a; 颜色 16进制的色彩值&#xff0c;如果每两位的值相同&#xff0c;可以缩写一半&#xff0c;例如&#xff1a; #000000可以缩写为#000;#336699可以缩写为#369; 盒尺寸 通常有下…

(C++)A+B 输入输出练习VI 每行的第一个数N,表示本行后面有N个数。

#include<cstdio>/* 4 1 2 3 4 5 1 2 3 4 5 */int main(){int n;while(scanf("%d",&n) ! EOF){int sum 0,a;for(int i 0;i<n;i){scanf("%d",&a);sum a;}printf("%d\n",sum); }return 0;}

NDK 提示undefined reference to xxx“的解决办法

在Android.mk文件的 LOCAL_SRC_FILES后面加入包含该类或函数的文件&#xff0c;用\隔开&#xff0c;\后换行继续添加 例如 LOCAL_SRC_FILES : NDKTest.cpp\bncore.c\bn_error.c\bn_fast_mp_invmod.c\bn_fast_mp_montgomery_reduce.c\bn_fast_s_mp_mul_digs.c\bn_fast_s_mp_mul_…

7. Query Expressions(查询表达式)

【返回目录】 查询表达式提供了与SQL这样的关系化和分级的查询语言相类似的语言集成的语法。一个查询表达式是以from子句开头以select或者group子句结束&#xff0c;这个初始的from子句可以在其后跟随任意多个from、let、where或者join子句。 那么查询表达式中的这些子句都是做…

CSS完美兼容IE6/IE7/IE8/IE9/IE10的通用方法

300px!important;width /**/:340px;margin:0 10px 0 10px} &#xff0c;关于这个/**/是什么我也不太明白&#xff0c;只知道IE5和firefox都支持但IE6不支持&#xff0c;如果有人理解的话&#xff0c;请告诉我一声&#xff0c;谢了&#xff01;&#xff1a;&#xff09; 3、ul标…

(C++)A+B 输入输出练习VII 输入包含若干行,每行输入两个整数a和b,由空格分隔。 对于每组输入,输出a和b的和,每行输出后接一个空行。

#include<stdio.h> /* 1 5 10 20 */int main() { int a,b;while(scanf("%d%d",&a,&b) ! EOF){printf("%d\n\n",ab);}return 0;}

Address already in use: JVM_Bind错误的解决

错误原因 tomcat的8005端口号被占用了 解决办法 关闭已有的占用端口 1. cmd—>netstat -an 查看当前开启的端口号 2. netstat -ano 获得端口号的pid码 3. skill -{pid} 杀死端口进程转载于:https://www.cnblogs.com/lxq0309/p/3736899.html

在SQL Server中如何转化长日期形式为短日期格式

convert(nvarchar(10),字段名,121)即可将时间格式转化为yyyy-mm-dd格式 convert中的121是指将datetime类型转换为char类型时获得包括世纪位数的4位年份。转载于:https://www.cnblogs.com/footleg/archive/2007/11/29/976451.html

看看Vector源码Java 9

2019独角兽企业重金招聘Python工程师标准>>> Vector类实现了一个可增长的对象数组。像数组一样&#xff0c;它包含可以使用整数索引随机访问。但是&#xff0c;Vector的大小可以根据需要增大或缩小&#xff0c;以适应在创建Vector之后添加和删除项目。 文档里的内容…

(C++)1016 部分A+B 正整数

#include<cstdio>int main(){ //1.读入a,Da,b,Dblong long a,b,Pa0,Pb0;int Da,Db;scanf("%lld%d%lld%d",&a,&Da,&b,&Db); //2.对于a,遍历每一位&#xff0c;加在Pa上 //2.1取余的方式遍历while(a>0){if(a%10Da){Pa Pa*10 Da;}a a/10;} …

MySQL Innodb日志机制深入分析

1.1. Log & Checkpoint Innodb的事务日志是指Redo log&#xff0c;简称Log,保存在日志文件ib_logfile*里面。Innodb还有另外一个日志Undo log&#xff0c;但Undo log是存放在共享表空间里面的&#xff08;ibdata*文件&#xff09;。 由于Log和Checkpoint紧密相关&#xff0…

单元测试的重要性

一些错误的认识 在实际的单元测试过程中总会有一些错误的认识左右着我们&#xff0c;使之成为单元测试最大的障碍&#xff0c;在此将其一一分析如下&#xff1a; 它太浪费时间了&#xff0c;现在要赶进度&#xff0c;时间上根本不允许&#xff0c;或者随便做做应付领导。 我是一…

浅谈网络协议(四) IP的由来--DHCP与PXE

2019独角兽企业重金招聘Python工程师标准>>> 上一节说过&#xff0c;IP就是一台计算机的通讯地址&#xff0c;要和其他机器通讯&#xff0c;就需要一个通讯地址&#xff0c;就要给网卡配置这么一个地址。 配置 IP 那如何配置呢&#xff1f;可以使用 ifconfig&#x…

(C++)1026 程序运行时间

#include<cstdio> const int CLK_TCK100;int main(){ //1.读入c1,c2int c1,c2;scanf("%d%d",&c1,&c2); //2.定义常量CLK_TCK100 //难点&#xff1a;不足 1 秒的时间四舍五入到秒 --不用round()&#xff0c;避免浮点数运算 int dif c2-c1;if(dif%100&…

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的Autowired注解&#xff0c;还支持几个由JSR-250规范定义的注解&#xff0c;它们分别是Resource、PostConstruct以及PreDestroy。  Resource的作用相当于Autowired&#xff0c;只不过Autowired按byType自动注入&#xff0c;而Resource默认按 byName自…

(C++)1046 划拳

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj)&#xff0c;对于任何非空引用值 x 和 y&#xff0c;当且仅当 x 和 y 引用同一个对象时&#xff0c;此方法才返回 true&#xff1b;注意&#xff1a;当此方法被重写时&#xff0c;通常有必要重写 hashCode 方法&#xff0c;以…

从0到1,苏宁API网关的演进之路

http://www.infoq.com/cn/articles/suning-11-11-api-gateway?utm_campaigninfoq_content&utm_sourceinfoq&utm_mediumfeed&utm_termglobal 2012年&#xff0c;在开放云融推动各产业全面发展的大背景下&#xff0c;苏宁API对外开放。基于苏宁各内部业务系统的资源…

HTML 注意事项

这行与下面图片的间距比较小asdf 代码如下: <table id"table1"cellspacing"0"cellpadding"0"width"100%"border"0"><tbody><tr><td>这行与下面图片的间距比较小</td></tr><tr>&l…

(C++)1008 数组元素循环右移问题

#include<cstdio> //注意&#xff1a;不允许使用另外数组,序列结尾不能有多余空格,不能直接认为right<n //1.读入数组长度&#xff0c;和右移位数&#xff0c;读入数组 //2.未必要对实际数组进行循环右移&#xff0c;只要输出结果表现出那样就可以 int main(){int n…

C# 文件操作(上传 下载 删除 文件列表...)

using System.IO; 1.文件上传 ---------- 如下要点&#xff1a; HTML部分&#xff1a; <form id"form1" runat"server" method"post" enctype"multipart/form-data"> <input id"FileUpLoad" type"file" …

5个常用Java代码混淆器 助你保护你的代码

【IT168 技术文档】 从事Java编程的人都知道&#xff0c;可以通过逆向工程反编译得到Java程序的源代码&#xff0c;这种反编译工具之一就是JAD。因此&#xff0c;为保护我们的劳动成果&#xff0c;尽可能给反编译人员制造障碍&#xff0c;我们可以使用Java Obfuscator(Java混淆…