【BZOJ】1030: [JSOI2007]文本生成器(AC自动机+dp)
题目
传送门:QWQ
传送到洛谷QWQ
分析
我一开始也不会做这题的,后来看了很多网上的题解,终于AC了。(我好菜啊)
主要参考:传送门QWQ
直接搞非常麻烦,反正我是不会做。于是考虑求反,即求有多少不包含任何单词的数量。最后再用$ {26}^m $减去就ok了。
于是在$ AC $自动机上搞$ dp $。
用 $ dp[i][j] $表示前$ i $个字符在$ AC $自动机上位置为$ j $的方案数。
那么可以得出$ dp[i+1][k]=dp[i+1][k]+dp[i][j] $如果k是合法的儿子。
所以还要判断一下合法性(合法性 即:不是任何一个单词的end)
代码
#include <bits/stdc++.h>
using namespace std;
const int N=, MOD=; int son[N][], fail[N], end[N], newp, rt, q[N];
int dp[][], n, m;
char s[N]; int find(int cur,int i)
{
if(!cur) return rt;
if(son[cur][i]) return son[cur][i];
return fail[son[cur][i]]=find(fail[cur],i);
} int main()
{
for (int i=;i<;i++) son[][i]=;
newp=rt=;
scanf("%d%d",&n,&m); //Trie
for(int i=;i<=n;i++)
{
scanf("%s",s+);
int cur=rt, l=strlen(s+);
for(int j=;j<=l;j++)
{
if(!son[cur][s[j]-'A']) son[cur][s[j]-'A']=++newp;
cur=son[cur][s[j]-'A'];
}
end[cur]=;
} //fail
int l=,r=;q[]=;
for(;l<=r;l++)
{
for(int i=;i<;i++)
if(son[q[l]][i])
{
fail[son[q[l]][i]]=find(fail[q[l]],i);
q[++r]=son[q[l]][i];
}
} //dp
dp[][]=;
for(int i=;i<=m;i++)
for(int j=;j<=newp;j++)
{
for(int k=;k<;k++)
{
int cur=j, f=;
while(cur)
{
if(end[son[cur][k]]) { f=; break; }
cur=fail[cur];
}
if(f) continue; //不能放
cur=j;
while(!son[cur][k])
{
cur=fail[cur]; //从j向fail[j]跳直到有k儿子
}
cur=son[cur][k];
dp[i+][cur]=(dp[i+][cur]+dp[i][j])%MOD;
}
} int anss=, ans=;
for (int i=;i<=m;i++) anss=(anss*)%MOD; //转换
for (int i=;i<=newp;i++)
{
ans=(ans+dp[m+][i])%MOD; //最终答案是所有dp[m+1][x]的和
} printf("%d\n",(anss-ans+MOD)%MOD);
return ;
}
【BZOJ】1030: [JSOI2007]文本生成器(AC自动机+dp)的更多相关文章
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2635 Solved: 1090 [id=1030&qu ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
随机推荐
- Java反射-初步入门
Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...
- EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放
前言描述 随着大屏时代和高清时代的到来,人们已经不再满足于VGA.CIF这种小分辨率了,取而代之的是720P.1080P.4K级的视频传输,虽然我们国家的基础带宽一直在上升,但普遍情况下,传输高清视频 ...
- 自定义view:view的绘制流程
1.view的绘制流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw. ...
- swift 3 发送 HTTP 请求函数
private func HttpPost(requestURL:String, postString:String) -> [String : AnyObject] { return Http ...
- runtime查找 UIAlertAction 的key 及 UIActionSheet 设置字体颜色
修改不了颜色了 结果发现kvo 的key 不对 哎 直接上代码 设置正确的属性找到对应的key 还以为iOS 11改变了方法 unsigned int count; Ivar *ivars = c ...
- FTRL笔记
这篇笔记主要参考冯杨的五篇博客:在线最优化求解(Online Optimization).因为对于在线学习方法,稀疏性问题需要特别关注:每次在线学习一个新 instance 的时候,优化方向并不一定是 ...
- 关于dyld: Library not loaded
在接入智凡迪的sdk过程中,遇到以下问题: dyld: Library not loaded: @rpath/SDKFramework.framework/SDKFramework Referen ...
- C# 根据日期计算星期几
region 根据年月日计算星期几(Label2.Text=CaculateWeekDay(,,);) /// <summary> /// 根据年月日计算星期几(Label2.Text=C ...
- Python 实现windows后台服务
# -*- coding: utf-8 -*- import sys import win32api import win32con import win32event import win32ser ...
- 对Json的各种遍历方法
慎用for in函数(有可能由于原型链的问题导致遍历问题): 如果要是用for in 一定要使用if (obj1.hasOwnProperty(key)) {}先做判断 解决方法 :1.eval() ...