洛谷P3041 视频游戏的连击Video Game Combos [USACO12JAN] AC自动机+dp
正解:AC自动机+dp
解题报告:
算是个比较套路的AC自动机+dp趴,,,
显然就普普通通地设状态,普普通通地转移,大概就f[i][j]:长度为i匹配到j
唯一注意的是,要加上所有子串的贡献,就在结构体中新加一个变量d表示在跟到这个节点的串以及后缀中完整串的个数
直接在bfs求fail的时候加上fail指针的d就欧克
啊当然只是为了方便描述所以说另开一个d,,,实际实现的话直接把标记结尾的那个值改成int类型搞下就欧克
然后说下细节,,,
其实就一个细节,就赋初值问题,要把除了f[i][0]的都设成-inf
原因挺显然的趴?拿样例为例好了,如果不这么设就会搞得明明只选了一个A就被计入了ABA一个串的贡献这样的乌龙QwQ
overr
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+,inf=1e9;
int n,K,f[N][N*],nod_cnt,as;
struct nod{int to[],fail,flg;}tr[N*];
char ch[N];
queue<int>Q; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:x;
}
il void insert(char *s)
{
ri lth=strlen(s+),nw=;
rp(i,,lth)
{
if(!tr[nw].to[s[i]-'A'+])tr[nw].to[s[i]-'A'+]=++nod_cnt;
nw=tr[nw].to[s[i]-'A'+];
}
// printf("nw=%d\n",nw);
tr[nw].flg=;
}
il void bfs()
{
rp(i,,)if(tr[].to[i])Q.push(tr[].to[i]);
while(!Q.empty())
{
ri nw=Q.front();Q.pop();tr[nw].flg+=tr[tr[nw].fail].flg;//printf("nw=%d flg=%d\n",nw,tr[nw].flg);
rp(i,,)
if(tr[nw].to[i])Q.push(tr[nw].to[i]),tr[tr[nw].to[i]].fail=tr[tr[nw].fail].to[i];
else tr[nw].to[i]=tr[tr[nw].fail].to[i];
}
} int main()
{
// freopen("3041.in","r",stdin);freopen("3041.out","w",stdout);
n=read();K=read();while(n--){scanf("%s",ch+);insert(ch);}bfs();
rp(i,,K)rp(j,,nod_cnt)f[i][j]=-inf;
rp(i,,K)
{
rp(j,,nod_cnt)
{
// printf("f[%d][%d]=%d\n",i,j,f[i][j]);
rp(k,,)f[i][tr[j].to[k]]=max(f[i][tr[j].to[k]],f[i-][j]+tr[tr[j].to[k]].flg);
}
}
rp(i,,nod_cnt)as=max(as,f[K][i]);
printf("%d\n",as);
return ;
}
这儿是代码鸭QwQ
洛谷P3041 视频游戏的连击Video Game Combos [USACO12JAN] AC自动机+dp的更多相关文章
- [洛谷3041]视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- 【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)
题目链接 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和. #include <cstdio> # ...
- [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)
Description 贝西正在打格斗游戏.游戏里只有三个按键,分别是“A”.“B”和“C”.游戏中有 N 种连击 模式,第 i 种连击模式以字符串 Si 表示,只要贝西的按键中出现了这个字符串,就算 ...
- P3041 [USACO12JAN]视频游戏的连击Video Game Combos
思路 简单的AC自动机上dp,暴力跳fail向子节点直接转移即可 代码 #include <cstdio> #include <algorithm> #include < ...
- 【USACO12JAN】视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
题面 sol 设\(f_{i,j}\)表示填了前\(i\)个字母,在\(AC\)自动机上跑到了节点\(j\)的最大得分.因为匹配需要暴跳\(fail\)所以预先把\(fail\)指针上面的匹配数传下来 ...
- 【题解】[USACO12JAN]视频游戏的连击Video Game Combos
好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...
- 洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】
这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include< ...
- 洛谷 P3041 [USACO12JAN] Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
随机推荐
- stm32之TIM+ADC+DMA采集50HZ交流信号
http://cache.baiducontent.com/c?m=9d78d513d98207f04fece47f0d01d7174a02d1743ca6c76409c3e03984145b5637 ...
- 根据IP获取国家
国外的还算比较权威的IP地址库,而且免费,每天调用次数不超过1000免费.超过另收费. public string Ip2Country(string ip) { try { string url = ...
- 教你一招:修复win7 系统自带的截图工具损坏
这个问题经常见,原因是注册表没有导入. 修复很简单. 打开资源管理器,在C盘中搜索到 tpcps.dll ,在其中选一个右击,选择注册dll,然后截图工具就被修复了. 有时候便签也会出现类似问题,方法 ...
- moment.js返回本周
项目中需要做个打卡的模块.里面有个模块需要返回当前这个星期从星期日到星期六的日期,如下图: 我是通过 moment.js 的 moment().day() 实现这个效果的,它的说明如下图: 关于这个插 ...
- Caffe、TensorFlow、MXnet三个开源库对比+主流分类模型对比
库名称 开发语言 支持接口 安装难度(ubuntu) 文档风格 示例 支持模型 上手难易 Caffe c++/cuda c++/python/matlab *** * *** CNN ** MXNet ...
- H3C S5120清除console口密码
1.开机启动交换机显示Press Ctrl-B to enter Extended Boot menu...0 字样迅速按Ctrl-B进入如下字符介面提示: Press Ctrl-B to ente ...
- Linux查找指令(阮一峰)
1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...
- Ubuntu安装redis缓存数据库
参考:http://blog.csdn.net/xiangwanpeng/article/details/54586087 1.在下载目录下 sudo wget http://download.red ...
- mysql 导入excel文件数据到数据库
load data local infile 'C:/Users/Administrator/Documents/gaunai2.csv' into table newtable (c1,c2) fi ...
- JavaScript 之 function函数及参数arguments
JavaScript用function关键字声明函数,可以用return返回值,也可以没有返回值. 建议:要么统一有返回值,要么统一都没有返回值,这样调试代码方便. 函数定义格式: function ...