日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

發布時間:2025/4/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html


題目描述

給定n個字符串(S1,S2,?,Sn),要求找到一個最短的字符串T,使得這n個字符串(S1,S2,?,Sn)都是T的子串。

輸入

第一行是一個正整數n(n<=12),表示給定的字符串的個數。以下的n行,每行有一個全由大寫字母組成的字符串。每個字符串的長度不超過50.

輸出

只有一行,為找到的最短的字符串T。在保證最短的前提下,如果有多個字符串都滿足要求,那么必須輸出按字典序排列的第一個。

樣例輸入

2
ABCD
BCDABC

樣例輸出

ABCDABC


題解

AC自動機+BFS

先求出fail數組和Trie圖,同時標記每個位置是哪些字符串的結尾,用二進制儲存。

要求包含所有串的最小長度,需要記錄當前包含哪些串,需要狀壓。

當到達字符串結尾時,更改狀態。

所以Trie圖可以看成一個分層圖,所求為0,1到(1<<n)-1,i的最短路。

由于每條路徑代表一個字符,所以邊權為1,可以使用BFS求最短路得解。

#include <cstdio> #include <cstring> char str[60] , ch[610] , ans[610]; int tot = 1 , next[610][26] , fail[610] , val[610] , qx[1500010] , qy[1500010] , l , r , dis[610][4096] , fromp[610][4096]; void build() {int x , i;for(i = 0 ; i < 26 ; i ++ ) next[0][i] = 1;l = r = 1 , qx[1] = 1;while(l <= r){x = qx[l ++ ];for(i = 0 ; i < 26 ; i ++ ){if(next[x][i])fail[next[x][i]] = next[fail[x]][i] , val[next[x][i]] |= val[fail[next[x][i]]] , qx[++r] = next[x][i];else next[x][i] = next[fail[x]][i];}} } int main() {int n , l , i , j , x , y;scanf("%d" , &n);for(i = 1 ; i <= n ; i ++ ){scanf("%s" , str + 1) , l = strlen(str + 1) , x = 1;for(j = 1 ; j <= l ; j ++ ){if(!next[x][str[j] - 'A']) next[x][str[j] - 'A'] = ++tot;x = next[x][str[j] - 'A'] , ch[x] = str[j];}val[x] |= 1 << (i - 1);}build();memset(dis , -1 , sizeof(dis));l = r = 1 , qx[1] = 1 , qy[1] = 0 , dis[1][0] = 0;while(l <= r){x = qx[l] , y = qy[l];for(i = 0 ; i < 26 ; i ++ ){int tx = next[x][i] , ty = y | val[tx];if(dis[tx][ty] == -1){dis[tx][ty] = dis[x][y] + 1 , fromp[tx][ty] = l;if(ty == (1 << n) - 1){int px = tx , py = ty , tmp;for(i = dis[tx][ty] ; i ; i -- )ans[i] = ch[px] , tmp = fromp[px][py] , px = qx[tmp] , py = qy[tmp];printf("%s\n" , ans + 1);return 0;}qx[++r] = tx , qy[r] = ty;}}l ++ ;}return 0; }

?

轉載于:https://www.cnblogs.com/GXZlegend/p/6825226.html

總結

以上是生活随笔為你收集整理的【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。