题目链接:点击查看

题目大意:给出 n 个匹配串,再给出一个模式串,问最少修改模式串中多少个字母可以使得模式串中不含有任意一个匹配串

题目分析:因为又是模式串与匹配串的题目,虽然与一般意义上的匹配不太一样,但鉴于数据都非常小,所以可以视为动态规划,先用AC自动机跑出每个可行状态,再在trie树上dp就好了,dp[ i ][ j ]代表到第 i 个字母为止,状态为 j 时最小需要改动的字符个数,然后就是很简单的dp了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;char s[1010];int fail[1010],trie[1010][26],mp[150],cnt;bool vis[1010];int dp[1100][1100];//dp[i][j]:长度为 i 的字符串中状态为 j 时满足条件所需要删除的最少次数 void insert_word()
{int len=strlen(s);int pos=0;for(int i=0;i<len;i++){int to=mp[s[i]];if(!trie[pos][to])trie[pos][to]=++cnt;pos=trie[pos][to];}vis[pos]=true;
}void getfail()
{queue<int>q;for(int i=0;i<26;i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int cur=q.front();q.pop();if(vis[fail[cur]])vis[cur]=true;for(int i=0;i<26;i++){if(trie[cur][i]){fail[trie[cur][i]]=trie[fail[cur]][i];q.push(trie[cur][i]);}elsetrie[cur][i]=trie[fail[cur]][i];}}
}void init()
{cnt=0;memset(vis,false,sizeof(vis));memset(trie,0,sizeof(trie));mp['A']=0,mp['C']=1,mp['G']=2,mp['T']=3;
}int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
//#endif
//  ios::sync_with_stdio(false);int n;int kase=0;while(scanf("%d",&n)!=EOF&&n){init();for(int i=1;i<=n;i++){scanf("%s",s);insert_word();}getfail();scanf("%s",s+1);int len=strlen(s+1);for(int i=0;i<=len;i++)for(int j=0;j<=cnt;j++)dp[i][j]=inf;dp[0][0]=0;for(int i=0;i<=len;i++)for(int j=0;j<=cnt;j++)if(dp[i][j]<inf)for(int k=0;k<4;k++){int nj=trie[j][k];if(vis[nj])continue;if(k==mp[s[i+1]])dp[i+1][nj]=min(dp[i+1][nj],dp[i][j]);elsedp[i+1][nj]=min(dp[i+1][nj],dp[i][j]+1);}int ans=inf;for(int i=0;i<=cnt;i++)ans=min(ans,dp[len][i]);if(ans==inf)ans=-1;printf("Case %d: %d\n",++kase,ans);}return 0;
}

HDU - 2457 DNA repair(AC自动机+dp)相关推荐

  1. HDU 2457 DNA repair (AC自动机+DP)

    题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. 1 #include<algorit ...

  2. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

  3. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  4. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  5. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  6. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  7. 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

  8. HDU - 2825 Wireless Password (AC自动机 + 状压dp)

    题目链接 题意 求至少包含KKK个给定字符串长度为NNN的字符串 思路 把所有可能的字符串建AC自动机,遍历所有节点dp[i][j][k]dp[i][j][k]dp[i][j][k] 表示以节点jjj ...

  9. HDU - 3247 Resource Archiver(AC自动机+状压dp+bfs)

    题目链接:点击查看 题目大意:给出 n 个目标串和 m 个病毒串,要求构造出一个长度最短的,且包含全部 n 个目标串,但是不能包含任意一个病毒串的01字符串,输出其最短长度 题目分析:比较综合的一道题 ...

最新文章

  1. 图片像素、英寸、厘米之间的单位换算
  2. 量子计算基础知识-2019/11/12
  3. spring boot一个模块加载不到引用另一个模块的mapper.xml报错org.apache.ibatis.binding.BindingException: Invalid bound sta
  4. SAP Spartacus把指定产品添加到购物车的API
  5. JAVA自学笔记23
  6. c#向MFC窗体发送消息
  7. php带参数跳转页面,如何带参数跳转php界面_后端开发
  8. proteus三输入与非门名字_dnf冒险团名字怎么改?冒险团名称修改方法
  9. 极客大学架构师训练营 组件设计原则 安全架构 防火墙ModSecurity 第21课 听课总结
  10. 阿里巴巴国际站统计国家来源小方法
  11. 日常英语---九、MapleStory Link Skills Guide
  12. 疯狂马斯克:如何带特斯拉走出困境?
  13. 4点策略教你如何做好社群营销
  14. 免费在线接线图软件 + 示例
  15. 【PowerQuery】在Excel中手动刷新数据连接
  16. Jquery 中 ajaxSubmit使用讲解
  17. 怎么洗掉衣服上的水粉颜料、丙烯颜料、水彩颜料、油画颜料
  18. wrk--测试-压测-cs-cheshi-yache-yc
  19. VMware Workstation Pro虚拟机命令行安装图形界面
  20. ubuntu更换pip3源提高下载速度

热门文章

  1. java中do loop的使用_Java中do-while循环——通过示例学编程(11)
  2. Nacos源码NacosAutoServiceRegistration
  3. java实现的代理的两种办法
  4. MySQL通信类型:同步或者异步
  5. Single System Image的理解
  6. 简单了解各种序列化技术-Protobuf序列化框架
  7. RocketMQ消息的存储结构
  8. 分布式架构中分布式事务
  9. 收货地址 - 设置默认收货地址
  10. MapReduce-流量统计求和-Reducer和JobMain代码编写