hdu2457 Trie图+dp

hdu2457

给定n个模式串, 和一个文本串

问如果修改最少的字符串使得文本串不包含模式串, 

输出最少的次数,如果不能修改成功,则输出-1

 

dp[i][j] 表示长度为i的字符串, 到达状态j(Trie图中的结点)所需要修改的最少次数

那么dp[0->n][0->size] = INF ,  dp[0][root] = 0,  n代表字符串长度, size代表状态数

那么答案就是  min{dp[n][size]}

 

我们根据模式串所建的Trie图, 进行模拟构造不包含模式串的字符串

从第一个字符串开始构造,依次递增,在构造此字符的同时,比较是否和输入串的该字符串相等,

如果相等,则表示该位置的字符不需要改变, 如果不同,则表示该位置的字符需要改变

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <queue>
  7 #include <stack>
  8 #include <vector>
  9 #include <map>
 10 #include <set>
 11 #include <string>
 12 #include <math.h>
 13 using namespace std;
 14 #pragma warning(disable:4996)
 15 typedef long long LL;                   
 16 const int INF = 1<<30;
 17 /*
 18 
 19 */
 20 struct Node
 21 {
 22     int fail, next[4];
 23     bool isWord;
 24     void init()
 25     {
 26         fail = -1;
 27         isWord = false;
 28         for (int i = 0; i < 4; ++i)
 29             next[i] = -1;
 30 
 31     }
 32 }Trie[1000 + 10];
 33 int size;
 34 char str[1000 + 10];
 35 int dp[1000 + 10][1000 + 10];
 36 int getCode(char ch)
 37 {
 38     if (ch == 'A')
 39         return 0;
 40     if (ch == 'G')
 41         return 1;
 42     if (ch == 'C')
 43         return 2;
 44     return 3;
 45 }
 46 void insert(int root, char str[])
 47 {
 48     int cur = root;
 49     for (int i = 0; str[i]; ++i)
 50     {
 51         int idx = getCode(str[i]);
 52         if (Trie[cur].next[idx] == -1)
 53         {
 54             Trie[size].init();
 55             Trie[cur].next[idx] = size++;
 56         }
 57         cur = Trie[cur].next[idx];
 58     }
 59     Trie[cur].isWord = true;
 60 }
 61 void makeFail(int root)
 62 {
 63     queue<int> q;
 64     int cur;
 65     for (int i = 0; i < 4; ++i)
 66     if (Trie[root].next[i] == -1)
 67         Trie[root].next[i] = root;
 68     else
 69     {
 70         Trie[Trie[root].next[i]].fail = root;
 71         q.push(Trie[root].next[i]);
 72     }
 73     while (!q.empty())
 74     {
 75         cur = q.front();
 76         q.pop();
 77         for (int i = 0; i < 4; ++i)
 78         {
 79             if (Trie[Trie[cur].fail].isWord)
 80                 Trie[cur].isWord = true;
 81             if (Trie[cur].next[i] == -1)
 82                 Trie[cur].next[i] = Trie[Trie[cur].fail].next[i];
 83             else
 84             {
 85                 Trie[Trie[cur].next[i]].fail = Trie[Trie[cur].fail].next[i];
 86                 q.push(Trie[cur].next[i]);
 87             }
 88         }
 89     }
 90 }
 91 
 92 //dp[i][j] 表示长度为i的字符串到达状态j,所要修改的次数,  如果状态为危险状态,那么肯定是INF
 93 int solve(int root, char *str)
 94 {
 95     int n = strlen(str);
 96     for (int i = 0; i <= n; ++i)
 97     for (int j = 0; j < size; ++j)
 98         dp[i][j] = INF;
 99 
100     dp[0][root] = 0;
101     for (int i = 0; i < n; ++i)
102     for (int j = 0; j < size; ++j)
103     if (dp[i][j] < INF)
104     {
105         for (int k = 0; k < 4; ++k)
106         {
107             int next = Trie[j].next[k];
108             if (Trie[next].isWord) continue;
109             int tmp;
110             if (k == getCode(str[i]))
111                 tmp = dp[i][j];//如果构造出的字符和输入字符相同,就不需要改变该位置的字符串
112             else
113                 tmp = dp[i][j] + 1;//否则,要改变该位置的字符串
114             dp[i + 1][next] = min(dp[i + 1][next], tmp);
115         }
116     }
117     int ans = INF;
118     for (int j = 0; j < size; ++j)
119         ans = min(ans, dp[n][j]);
120     if (ans == INF) ans = -1;
121     return ans;
122 }
123 
124 int main()
125 {
126     int n, k = 1;
127     char segment[20+10];
128     while(scanf("%d", &n), n)
129     {
130         Trie[0].init();
131         Trie[0].fail = 0;
132         size = 1;
133         for (int i = 0; i < n; ++i)
134         {
135             scanf("%s", segment);
136             insert(0, segment);
137         }
138         makeFail(0);
139         scanf("%s", str);
140         printf("Case %d: %d\n", k, solve(0, str));
141         k++;
142 
143     }
144     return 0;
145 }

 

转载于:https://www.cnblogs.com/justPassBy/p/4593976.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql中if语句的用法_Python中的if条件语句

Python中的if语句在实际的编程中&#xff0c;经常需要检查一系列条件&#xff0c;并据此决定采取什么措施。正常情况下&#xff0c;程序的执行是自上而下的进行&#xff0c;if语句则根据条件判断&#xff0c;实现程序的执行顺序改变。一、if-else语句1、语法&#xff1a;if 条件…

mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法

权限问题&#xff0c;授权 给 root 所有sql 权限 mysql> grant all privileges on *.* to root"%" identified by ".";Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)转载于:https://www.cnbl…

mysql中non用什么_mysql Non-Transactional Database Only(只支持MyISAM)

后来在做WordPress&#xff0c;一开始还不知道原来WordPress用的是InnoDB数据引擎&#xff0c;于是在原来的数据库里面就建了一个数据库,一开始也没发觉问题&#xff0c;安装&#xff0c;导入sql&#xff0c;都没问题&#xff0c;当时也没多想。直到这几天因为又要装多一个Word…

openSUSE 11 上的配置可以Xmanager远程桌面

openSUSE 11 上的配置(适用于默认图形环境为KDE的Linux)&#xff1a; 1、配置KDM。 openSUSE 11的默认图形环境为KDE&#xff0c;虽然可以同时安装GDM和KDM&#xff0c;但默认只启动了KDM。所以openSUSE 11只需配置KDM&#xff0c;如果你启动了GDM来代替KDM&#xff0c;则配置可…

timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...

相关历史文章(阅读本文前&#xff0c;您可能需要先看下之前的系列?)国内最全的Spring Boot系列之三2020上半年发文汇总「值得收藏」GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇GraphQL的探索之路 – SpringBoot集成GraphQL之Query篇三 - 第316篇GraphQL的…

图片的缩放(放大缩小)

package com.school.util;import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;import javax.imageio.ImageIO; /*** * <b>类名称&#xff1a;图片处理工具类</b>ImageUtils…

sql多层嵌套别名无效_SQL之复杂查询

前文学了汇总分析&#xff0c;学了常见的汇总函数&#xff0c;会分组并且掌握了对分组结果指定条件。今天开始学习SQL的视图和子查询&#xff0c;还有数据库关联与嵌套查询内容的学习。一、视图1.1视图是有单固定存储可反复读取使用的子查询&#xff0c;所以视图适用于频繁使用…

POJ 1195 Mobile phones【 二维树状数组 】

题意&#xff1a;基础的二维数组&#xff0c;注意 0 lowbit(0)会陷入无限循环----- 之前做一道一维的一直tle,就是因为这个-------------------------- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #includ…

mysql 交叉连接的用法_深入理解MySQL的外连接、内连接、交叉连接

1、内联接(典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符)。包括相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。2、外联接。外联接可以是左向外联…

基于Angularjs实现分页

前言 学习任何一门语言前肯定是有业务需求来驱动你去学习它&#xff0c;当然ng也不例外&#xff0c;在学习ng前我第一个想做的demo就是基于ng实现分页&#xff0c;除去基本的计算思路外就是使用指令封装成一个插件&#xff0c;在需要分页的列表页面内直接引用。 插件 在封装分页…

mbot机器人初体验_[首发开箱]Makeblock mBot Ranger mBot游侠版 强大的STEM教育机器人...

本帖最后由 ahagowo 于 2016-4-17 08:38 编辑mBot游侠机器人套件是一个三种功能于一身的STEM教育机器人套件&#xff0c;它支持3种组装形态&#xff1a;机器人坦克&#xff0c;三轮赛车&#xff0c;和自平衡车。mBot游侠可通过 iPad&#xff0c;平板计算机或笔记本计算机来编程…

mysql数据库设计规范_MYSQL数据库设计规范与原则

MYSQL数据库设计规范1、数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_组成;命名简洁明确(长度不能超过30个字符);例如&#xff1a;user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀;除非是备份数据库可以加0-9的自然…

jar乱放问题

之前看到一个项目不能继承类SimpleTagSuppert类&#xff0c;而将jsp-api.jar&#xff08;不知道servlet-api.jar能不能放&#xff09;放入到了 jdk/jre/lib/ext包下面结果不仅正在写的jsp不能运行&#xff0c;以前的web应用也不能运行&#xff0c;会出现 java.lang.ClassNotFo…

python课程笔记_Python课程笔记(一)

由于新冠状病毒的爆发&#xff0c;不得不在家里上网课&#xff0c;开课已经两个礼拜了&#xff0c;今天上完Python课后&#xff0c;准备整理一下最近学习Python的笔记。人生苦短&#xff0c;我用Python一、Hello World初学一门新的语言&#xff0c;就一定要从Hello World开始pr…

Bootstrap系列 -- 41. 带表单的导航条

有的导航条中会带有搜索表单,在Bootstrap框架中提供了一个“navbar-form”&#xff0c;使用方法很简单&#xff0c;在navbar容器中放置一个带有navbar-form类名的表单。navbar-left”让表单左浮动&#xff0c;更好实现对齐。在Bootstrap框架中&#xff0c;还提供了“navbar-rig…

mysql log table_mysqlbinlog功能扩展--table参数

目的mysqlbinlog在分析mysql的binlog日志时&#xff0c;有时需要针对某个表的操作进行分析。但是这个表属于“冷数据”&#xff0c;操作记录相对较少&#xff0c;而其他表操作往往很频繁&#xff0c;binlog日志量特别大。尤其是当binlog的模式设置为ROW时&#xff0c;情况就更加…

python递归迭代_Python入门基础知识点(python迭代器和递归)

函数名的使用&#xff1a;函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量函数名的内存地址&#xff1a;deffunc():passprint(func) #函数的内存地址结果&#xff1a;函数名可以赋值给其他变量&#xff1a;deffunc():print(1)afunca()func()#函数名可以…

怎么调处vs2010的MSDN帮助文档

如果装的是vs2010专业版的话 直接按F1直接可调出在线的帮助 直接按F2可以调出本机版的 转载于:https://www.cnblogs.com/fag888/p/5789159.html

redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange

namespace app\admin\controller;use think\cache\driver\Redis;use think\Controller;use \think\Db;class Index extends Controller{//获取redispublic function getRedis(){$redis new \Redis();$redis->connect(127.0.0.1,6379);$redis->auth(root); //redis密码ec…

如何写好博客

好的博客是用来解决问题的&#xff0c;每一篇文章都应该以如何解决问题为驱动力&#xff0c;而不是知识点的累加&#xff0c;比如说之前写的[MVC]系列&#xff0c;均为知识点的堆积&#xff0c;没有例子和代码&#xff0c;也没有说明问题&#xff0c;这样的文章&#xff0c;基本…