HDU 2457 DNA repair(AC自动机 + DP)题解
题意:n个病毒串,给你一个串t,问你最少改几个能没有病毒串
思路:去年还觉得挺难得...其实就是AC自动机上跑一下简单的DP,每个位置都往没病毒的地方跑,然后看一下最少是什么。
代码:
#include<set> #include<map> #include<queue> #include<cmath> #include<string> #include<cstdio> #include<vector> #include<cstring> #include <iostream> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn = 1000 + 5; const int M = 50 + 5; const ull seed = 131; const int INF = 0x3f3f3f3f; const int MOD = 20090717; int n, m; int dp[maxn][maxn]; int getid(char s){if(s == 'A') return 0;if(s == 'C') return 1;if(s == 'G') return 2;return 3; } struct Aho{struct state{int next[4];int fail, cnt;}node[maxn];int size;queue<int> q;void init(){size = 0;newtrie();while(!q.empty()) q.pop();}int newtrie(){memset(node[size].next, 0, sizeof(node[size].next));node[size].cnt = node[size].fail = 0;return size++;}void insert(char *s){int len = strlen(s);int now = 0;for(int i = 0; i < len; i++){int c = getid(s[i]);if(node[now].next[c] == 0){node[now].next[c] = newtrie();}now = node[now].next[c];}node[now].cnt = 1;}void build(){node[0].fail = -1;q.push(0);while(!q.empty()){int u = q.front();q.pop();if(node[node[u].fail].cnt && u) node[u].cnt = 1;for(int i = 0; i < 4; i++){if(!node[u].next[i]){if(u == 0)node[u].next[i] = 0;elsenode[u].next[i] = node[node[u].fail].next[i];}else{if(u == 0) node[node[u].next[i]].fail = 0;else{int v = node[u].fail;while(v != -1){if(node[v].next[i]){node[node[u].next[i]].fail = node[v].next[i];break;}v = node[v].fail;}if(v == -1) node[node[u].next[i]].fail = 0;}q.push(node[u].next[i]);}}}}void query(char *s){int len = strlen(s);for(int i = 0; i <= len; i++){for(int j = 0; j < size; j++){dp[i][j] = INF;}}dp[0][0] = 0;for(int i = 0; i < len; i++){for(int j = 0; j < size; j++){if(dp[i][j] == INF) continue;for(int k = 0; k < 4; k++){if(node[node[j].next[k]].cnt) continue;if(getid(s[i]) != k) dp[i + 1][node[j].next[k]] = min(dp[i + 1][node[j].next[k]], dp[i][j] + 1);else dp[i + 1][node[j].next[k]] = min(dp[i + 1][node[j].next[k]], dp[i][j]);}}}int ans = INF;for(int i = 0; i < size; i++)if(node[i].cnt == 0) ans = min(ans, dp[len][i]);if(ans == INF) printf("-1\n");else printf("%d\n", ans);}}ac; char s[1005]; int main(){int ca = 1;while(~scanf("%d", &n) && n){ac.init();for(int i = 0; i < n; i++){scanf("%s", s);ac.insert(s);}ac.build();scanf("%s", s);printf("Case %d: ", ca++);ac.query(s);}return 0; }
转载于:https://www.cnblogs.com/KirinSB/p/11190991.html
HDU 2457 DNA repair(AC自动机 + DP)题解相关推荐
- HDU - 2457 DNA repair(AC自动机+dp)
题目链接:点击查看 题目大意:给出 n 个匹配串,再给出一个模式串,问最少修改模式串中多少个字母可以使得模式串中不含有任意一个匹配串 题目分析:因为又是模式串与匹配串的题目,虽然与一般意义上的匹配不太 ...
- HDU 2457 DNA repair (AC自动机+DP)
题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. 1 #include<algorit ...
- POJ 3691 DNA repair AC自动机 + DP
题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道 dp[i][j] 为文本串到 第i ...
- HDU 2296 Ring AC自动机 + DP
题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路: AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- uvalive4842(AC自动机+DP)
题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...
- bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5187 Solved: 2136 [Submit][St ...
- 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)
Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...
- HDU - 2825 Wireless Password (AC自动机 + 状压dp)
题目链接 题意 求至少包含KKK个给定字符串长度为NNN的字符串 思路 把所有可能的字符串建AC自动机,遍历所有节点dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示以节点jjj ...
- HDU - 3247 Resource Archiver(AC自动机+状压dp+bfs)
题目链接:点击查看 题目大意:给出 n 个目标串和 m 个病毒串,要求构造出一个长度最短的,且包含全部 n 个目标串,但是不能包含任意一个病毒串的01字符串,输出其最短长度 题目分析:比较综合的一道题 ...
最新文章
- 【Linux】查询文件中指定字符串的记录
- C语言程序模拟银行输入密码,模拟银行输入密码--源码
- 超干货!当初我要是这么学习操作系统就好了(附带思维导图)
- .NET Core with 微服务 - 什么是微服务
- Day7--误差反向传播
- Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
- 手机中必备的黑科技App,个个好用至极,现在的你一定需要
- 全网最全Linux常用命令
- 抗击疫情,宜复辟拱手礼
- 解决旅游行业营销人员痛点的作品策划
- java实现数据库同步
- ansys静态结构分析
- 『 论文阅读』Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling
- 人生的苦难需要时间去磨练
- uniapp + vue3微信小程序开发(2)活体人脸识别
- 出口美国的电动自行车UL2849测试和GCC检测标准
- samba文件共享服务器,全网最详细的samba文件共享服务!
- VMware虚拟机nat模式详解
- eth0: no IPv6 routers present
- UDS-RequestDownload(0x34) service
热门文章
- 俄罗斯一款地图软件无意曝光300多个军事基地
- 【SDOI2014】数表
- iOS 编写高质量Objective-C代码(五)
- .NET:OrderBy和ThenBy
- vim格式化代码实际上就是 缩进代码, 命令是等号=
- App调试内存泄露之Context篇(下)-App调试内存泄露之Context篇(下)
- [转]以绝招应对损招 查***
- modal 弹出层后禁止底层滚动
- while (true) 和 for (;;) 哪个更快?
- 你能相信这些逼真的油画是前端小姐姐只用HTML+CSS画出来的吗?精细到毛发,让美术设计也惊叹丨GitHub热榜...