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.pswp.cn/news/273175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273175.shtml
英文地址,請注明出處:http://en.pswp.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;基本…