UVa 11468 (AC自動機 概率DP) Substring

將K個模板串構成一個AC自動機,那些能匹配到的單詞節點都稱之為禁止節點。

然后問題就變成了在Tire樹上走L步且不經過禁止節點的概率。

根據全概率公式用記憶化搜索求解。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 using namespace std;
  5 
  6 const int maxnode = 500;
  7 const int sigma_size = 64;
  8 int idx[256];
  9 
 10 struct AhoCorasickAutomata
 11 {
 12     int ch[maxnode][sigma_size];
 13     int match[maxnode];
 14     int f[maxnode];
 15     int sz;
 16 
 17     void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
 18 
 19     void insert(char* s)
 20     {
 21         int u = 0, n = strlen(s);
 22         for(int i = 0; i < n; i++)
 23         {
 24             int c = idx[s[i]];
 25             if(!ch[u][c])
 26             {
 27                 memset(ch[sz], 0, sizeof(ch[sz]));
 28                 match[sz] = 0;
 29                 ch[u][c] = sz++;
 30             }
 31             u = ch[u][c];
 32         }
 33         match[u] = 1;
 34     }
 35 
 36     void getFail()
 37     {
 38         queue<int> q;
 39         f[0] = 0;
 40         for(int c = 0; c < sigma_size; c++)
 41         {
 42             int u = ch[0][c];
 43             if(u) { f[u] = 0; q.push(u); }
 44         }
 45         while(!q.empty())
 46         {
 47             int r = q.front(); q.pop();
 48             for(int c = 0; c < sigma_size; c++)
 49             {
 50                 int u = ch[r][c];
 51                 if(!u) { ch[r][c] = ch[f[r]][c]; continue; }
 52                 q.push(u);
 53                 int v = f[r];
 54                 while(v && !ch[v][c]) v = f[v];
 55                 f[u] = ch[v][c];
 56                 match[u] |= match[f[u]];
 57             }
 58         }
 59     }
 60 }ac;
 61 
 62 int n;
 63 const int maxl = 100 + 10;
 64 char s[30][30];
 65 double prob[sigma_size];
 66 
 67 int vis[maxnode][maxl];
 68 double d[maxnode][maxl];
 69 
 70 double getProb(int u, int L)
 71 {
 72     if(L == 0) return 1.0;
 73     if(vis[u][L]) return d[u][L];
 74     vis[u][L] = 1;
 75     double& ans = d[u][L];
 76     ans = 0;
 77     for(int c = 0; c < n; c++)
 78         if(!ac.match[ac.ch[u][c]])
 79             ans += prob[c] * getProb(ac.ch[u][c], L-1);
 80     return ans;
 81 }
 82 
 83 int main()
 84 {
 85     //freopen("in.txt", "r", stdin);
 86 
 87     int T;
 88     scanf("%d", &T);
 89     for(int kase = 1; kase <= T; kase++)
 90     {
 91         int k, L;
 92         scanf("%d", &k);
 93         for(int i = 0; i < k; i++) scanf("%s", s[i]);
 94 
 95         scanf("%d", &n);
 96         for(int i = 0; i < n; i++)
 97         {
 98             char s1[9];
 99             scanf("%s%lf", s1, &prob[i]);
100             idx[s1[0]] = i;
101         }
102 
103         ac.init();
104         for(int i = 0; i < k; i++) ac.insert(s[i]);
105         ac.getFail();
106         scanf("%d", &L);
107         memset(vis, 0, sizeof(vis));
108         printf("Case #%d: %.6f\n", kase, getProb(0, L));
109     }
110 
111     return 0;
112 }
代碼君

?

轉載于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4394173.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 檢查點_my05_mysql檢查點簡述

簡單描述一下mysql 檢查點&#xff0c;對mysql數據庫恢復的理解有所幫助。數據庫版本mysql> selectversion();-----------| version() |-----------| 8.0.11 |-----------1 row in set (0.00 sec)檢查點查看mysql>show engine innodb status\G;---LOG---Log sequence num…

VS2010無法執行自動化測試解決方案

在實際的工作過程中&#xff0c;當你發現你的VS2010無法執行自動化測試用例&#xff0c;剛好你發現你的電腦安裝有VS2012&#xff0c;那么好了&#xff0c;請卸載你的VS2012再試試...轉載于:https://www.cnblogs.com/captainR/p/3566751.html

停止Hadoop或HBase集群的腳本

#!/bin/sh #echo "waring" #read NAME #等待用戶輸入并把輸入的值付給NAME NAME$1 #將腳本第一個參數賦給NAME #引用變量時加上"{}",是個好習慣,利于shell辨別變量邊界 if [ -z ${NAME} ] ; then #執行腳本沒有輸入參數,默認關閉hadoopstop-all.sh elif [ …

css 偽元素分享!!!

最近接觸到的css 偽元素覺得還算不錯 分享下&#xff1a; 1、清楚內盒浮動設置&#xff1a; .back_list ul{padding:12px 0 0 12px;zoom:1;} .back_list ul:after{clear: both;content: ".";display: block;height: 0;visibility: hidden;}/*清楚內盒浮動設置*/ 2、偽…

公鑰和私鑰 java_公鑰與私鑰 - yxhxj2006 - BlogJava

評論# re: 公鑰與私鑰 [未登錄]2014-01-08 17:43workeruseful for me 回復 更多評論# re: 公鑰與私鑰2014-04-18 11:05Eva特別棒&#xff01; 謝謝&#xff01;worker回復 更多評論# re: 公鑰與私鑰 [未登錄]2014-06-11 17:10mike# re: 公鑰與私鑰2014-11-10 17:05游客太有用…

zepto學習之路--源代碼提取

最近在看zepto的源代碼&#xff0c;把一些有用的函數摘出來&#xff0c;看看zepto是怎么實現的&#xff0c;自己做的時候也可以用。說實話&#xff0c;zepto的實現有一些看起來還是很晦澀的&#xff0c;可能是自己的水平不夠&#xff0c;看不透作者的真正的意圖。 1、zepto的正…

java byte 整數_java整數與byte數組的轉換實現代碼

java整數與byte數組的轉換實現代碼這里對java中整數與byte數組的轉換進行了實現&#xff0c;平時的項目中很少用的到&#xff0c;但是特定需求的時候還是需要的&#xff0c;這里就記錄下&#xff0c;親測可用&#xff0c;實現代碼&#xff1a;public class NumberUtil {/*** in…

藍橋杯 花朵數

一個N位的十進制正整數&#xff0c;如果它的每個位上的數字的N次方的和等于這個數本身&#xff0c;則稱其為花朵數。 例如&#xff1a; 當N3時&#xff0c;153就滿足條件&#xff0c;因為 1^3 5^3 3^3 153&#xff0c;這樣的數字也被稱為水仙花數&#xff08;其中&#xff0…

windows 2003添加刪除windows組件中無iis應用程序服務器項的解決方法

解決方法如下: 1.開始 -- 運行,輸入 c:\Windows\inf\sysoc.inf,會打開這個文件;在sysoc.inf中找到"[Components]"這一段,并繼續找到類 似"iisiis.dll,OcEntry,iis.inf,hide,7" 的一行字,把這一行替換為"iisiis.dll,OcEntry,iis.inf,,7"。如果已經…

java打印菱形代碼_Java打印菱形高效簡潔代碼

importjava.util.Scanner;publicclass打印菱形{publicstaticvoidmain(String[]args){/**菱形**************************/ScannerinputScannernewScanner(System.in);System.out.prin...import java.util.Scanner;public class 打印菱形 {public static void main(String[] arg…

QT mainwindow四件套

最近在學習QT。下面總結一下mainwindow的設置步驟。 使用的平臺為vs2013qt5.3.2qt-vs-addin1.2.3 1)安裝軟件 首先安裝vs2013&#xff0c;這個不多介紹。 然后安裝qt5.3.2和addin1.2.3。并設置相關環境。詳細見http://tieba.baidu.com/p/3451630520?pid61264366864#6126436686…

go mysql recover_golang用panic和recover做業務流程中斷的嘗試

隨著使用golang越來越頻繁&#xff0c;發現golang有一個地方非常不方便&#xff0c;就是在錯誤處理方面。先來看看golang中通常的錯誤處理方法&#xff1a;通常的error處理package mainimport ("errors""fmt")func a() (err error) {err errors.New("…

ROC曲線【轉】

ROC曲線&#xff08;Receiver Operating Characteeristic Curve&#xff09;是顯示Classification模型真正率和假正率之間折中的一種圖形化方法 解讀ROC圖的一些概念定義&#xff1a; 真正&#xff08;True Positive , TP&#xff09;被模型預測為正的正樣本 假負&#xff08;F…

更改密碼 sp_password

sp_password添加或更改 Microsoft SQL Server? 登錄的密碼。語法sp_password[ [ old ] old_password , ]{ [new ] new_password }[, [ loginame ] login ]參數[old] old_password是舊密碼。old_password為 sysname 類型&#xff0c;其默認值為 NULL。[new] new_password是新…

java eclipse oxygen_Eclipse Java Oxygen配置Tomcat

eclipse oxygen 配置tomcat 9.0第一步 裝上eclipse的EE插件因為我以前學習java都是用eclipse oxygen的se版本&#xff0c;所以并不支持j2EE&#xff0c;所以第一步&#xff0c;就是要先把它升級為EE版本。有兩種方法供我們選擇。重新安裝eclipse的EE版本。安裝eclipse的EE插件。…

五大常用算法之二:動態規劃算法

一、基本概念 動態規劃過程是&#xff1a;每次決策依賴于當前狀態&#xff0c;又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的&#xff0c;所以&#xff0c;這種多階段最優化決策解決問題的過程就稱為動態規劃。 二、基本思想與策略 基本思想與分治法類似&am…

java 數組處理_JAVA操作數組

使用 Arrays 類操作 Java 中的數組Arrays 類是 Java 中提供的一個工具類&#xff0c;在 java.util 包中。該類中包含了一些方法用來直接操作數組&#xff0c;比如可直接實現數組的排序、搜索等Arrays 中常用的方法&#xff1a;1、 排序語法&#xff1a; Arrays.sort(數組名);可…

VB調用VC DLL函數

—————————————————————————VC部分—————————————————————————————————————聲明 ******************************************************************************************************** extern "C&q…

java拆裝_JAVA線性表拆解

線性表(List)是一種線性結構。其特點是數據元素直線的線性關系。1.線性表抽象類定義public abstract class AbsList implements Iterable&#xff0c;List{protected int length;abstract public T get(int i); //返回第i(i≥0)個元素abstract public boolean set(int i, T x);…

display:none;與visibility:hidden;的區別

display:none;不會占用任何空間 visibility:hidden;會占用隱藏前的空間大小轉載于:https://www.cnblogs.com/yaser/p/4414825.html