1. 程式人生 > >BZOJ2946 [Poi2000]公共串(字尾自動機)

BZOJ2946 [Poi2000]公共串(字尾自動機)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 2001 * 2, INF = 1e9 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '
9') x = x * 10 + c - '0', c = getchar(); return x * f; } struct SuffixAut { int fa[MAXN], len[MAXN], ch[MAXN][27], tot, last, root, ans, cur; SuffixAut() { cur = tot = last = root = 1; ans = 0;} void insert(int x) { int now = ++tot, pre = last; last = now; len[now]
= len[pre] + 1; for(; pre && !ch[pre][x]; pre = fa[pre]) ch[pre][x] = now; if(!pre) fa[now] = root; else { int q = ch[pre][x]; if(len[q] == len[pre] + 1) fa[now] = q; else { int nows = ++tot; memcpy(ch[nows], ch[q],
sizeof(ch[q])); fa[nows] = fa[q]; fa[q] = fa[now] = nows; len[nows] = len[pre] + 1; for(; pre && ch[pre][x] == q; pre = fa[pre]) ch[pre][x] = nows; } } } int work(int x) { if(ch[cur][x]) {cur = ch[cur][x]; ans++; return ans;} for(; cur && !ch[cur][x]; cur = fa[cur]); if(!cur) cur = root, ans = 0; else ans = len[cur] + 1, cur = ch[cur][x]; return ans; } }Suf[6]; char s[6][MAXN]; int N[6]; int main() { #ifdef WIN32 freopen("a.in", "r", stdin); #else freopen("pow.in", "r", stdin); freopen("pow.out", "w", stdout); #endif int num = read(); for(int i = 1; i <= num; i++) scanf("%s", s[i] + 1), N[i] = strlen(s[i] + 1); for(int i = 2; i <= num; i++) for(int j = 1; j <= N[i]; j++) Suf[i].insert(s[i][j] - 'a'); int out = 0; for(int i = 1; i <= N[1]; i++) { int ans = INF; for(int j = 2; j <= num; j++) ans = min(ans, Suf[j].work(s[1][i] - 'a')); out = max(out, ans); } printf("%d", out); return 0; }

相關推薦

BZOJ2946 [Poi2000]公共(字尾自動機)

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 2001 * 2, INF = 1e9 + 10; inline int

[BZOJ2946][Poi2000]公共 後綴自動機

文件 include poi using string 一次 一行 ont element 2946: [Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1367 Solved: 612[Submit

[bzoj2946][Poi2000]公共_字尾陣列_二分

公共串 bzoj-2946 Poi-2000 題目大意:給定$n$個字串,求他們的最長公共子串。 註釋:$1\le n\le 5$,$1\le minlen<maxlen\le 2000$。 想法: 常規套路。 我們把這$n$個串拼一起,中間加上$n-1$個不同的非字符集陣列隔開。 緊接

BZOJ 2946 POI2000 公共 後綴自動機(多最長公共

調整 log spa size 暴力 pan emc auto 結束 題意概述:給出N個字符串,每個串的長度<=2000(霧。。。可能是當年的年代太久遠機子太差了),問這N個字符串的最長公共子串長度為多少。(N<=5) 拋開數據結構,先想想樸素做法。 設計一

bzoj 4032 [HEOI2015]最短不公共——字尾自動機

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的話就對 b 建字尾自動機,在 a 上列舉從每個位置開始的子串或者找子序列(子序列就是記錄 a 的前 i 個,走到 b 的 j 狀態用的最短長度),對應到自動機上看看能不能走下去

SPOJ LCS 最長公共 字尾自動機&字尾樹(Ukkonen)

  終於搞清楚了這兩個噁心的演算法。其實字尾樹也不難寫嘛。 題目   給定兩個字串a和b,求在a和b中都有出現的連續子串的最長長度。 樣例輸入 alsdfkjfjkdsal fdjskalajfkdsla 樣例輸出 3 做法1

最長公共 字尾自動機

【題目描述】 給定兩個字串A和B,求它們的最長公共子串 【分析】 我們考慮將A串建成字尾自動機 令當前狀態為s,同時最大匹配長度為len 我們讀入字元x。如果s有標號為x的邊, 那麼s=trans(s

BZOJ2946公共 [SAM]

接下來 要求 構建 splay mil 至少 ast discus 最小值 公共串 Time Limit: 3 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description   給出幾個由小寫字母構成

BZOJ 1396 識別子 (字尾自動機+線段樹)

題目大意: 給你一個字串S,求關於每個位置x的識別串T的最短長度,T必須滿足覆蓋x,且T在S中僅出現一次 神題 以節點x為結尾的識別串,必須滿足它在$parent$樹的子樹中只有一個$endpos$節點 若令$fa=pre_{x},L=dep_{fa},R=dep_{x}$ 1.對於以$i\in[1

BZOJ 3676 [Apio2014]迴文 (字尾自動機+manacher)

題目大意: 給你一個字串,求其中迴文子串的長度*出現次數的最大值 明明是PAM裸題我幹嘛要用SAM做 迴文子串有一個神奇的性質,一個字串本質不同的迴文子串個數是$O(n)$級別的 用$manacher$的思想分析一下,$maxright$指標向右擴展才會產生新的迴文串 其它的迴文串都根據之前求得的資

【BZOJ1396】識別子 - 字尾自動機+線段樹

題意: Description Input 一行,一個由小寫字母組成的字串S,長度不超過10^5 Output L行,每行一個整數,第i行的資料表示關於S的第i個元素的最短識別子串有多長. 題解: 先建出SAM,顯然right集合大小為1的子串,即在pa

【二分+字串hs】[POI2000] 公共

題目描述 給出幾個由小寫字母構成的單詞,求它們最長的公共子串的長度。 任務: l 讀入單詞 l 計算最長公共子串的長度 l 輸出結果 輸入格式 檔案的第一行是整數 n,1<=n<=5,表示單詞的數量。接下來n行每行一個單詞,只由小寫字母組成,單詞的

SPOJ1812 LCS2 POI2000 BZOJ2946 公共 SAM

題目連結 連結是洛谷有翻譯的。 題意: 給定一些字串,求出它們的最長公共子串。輸入至多10行,每行包含不超過100000個的小寫字母。 這題似乎和POI2000BZOJ2946是同一道題,於是我就也掛上那個標籤了。PS:BZOJ的那個是個許可權題。。。 題解: 我們之前做過兩

SPOJ 1812 Longest Common Substring II 字尾自動機求多字串最長公共

題意: 給若干字串,求它們的最長公共子串的長度。 題解:字尾自動機。 對第一個串建立SAM,並拓撲排序。 用後面的串分別匹配。 對於SAM,每個節點新增兩個值ml,ans; ml代表該節點滿足單一字串時的最大值,匹配完一個字串後重置為0; an

Longest Common Substring II(字尾自動機求多個的最長公共

A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor

poj 2774 最長公共--字串hash或者字尾陣列或者字尾自動機

http://poj.org/problem?id=2774 想用字尾陣列的看這裡:http://blog.csdn.net/u011026968/article/details/22801015 本文主要講下怎麼hash去找 開始的時候寫的是O(n^2 logn)演算法

SPOJ 1811. Longest Common Substring (LCS,兩個字串的最長公共字尾自動機SAM)

/* *********************************************** Author :kuangbin Created Time :2013-9-8 23:27:46 File Name :F:\2013ACM練習\專

SPOJ1811最長公共問題(字尾自動機)

題意:給兩個串A和B,求這兩個串的最長公共子串。 分析:其實本題用字尾陣列的DC3已經能很好的解決,這裡我們來說說利用字尾自動機如何實現。 對於串A和B,我們先構造出串A的字尾自動機,那麼然後用

字尾自動機(多個穿的最長公共)spoj1812

SPOJ Problem Set (classical) 1812. Longest Common Substring II Problem code: LCS2 A string is finite sequence of characters over a non-

SPOJ1812(字尾自動機求n個的最長公共)

題意:給定n個串,求它們的最長公共子串。 思路就是:先將一個串建SAM,然後用後面的串去匹配,對於每一個串,儲存最大值,對於不同的串,更新最小值。 SAM結點多兩個值,ml表示多個串的最小值,nl表示當前串匹配的最大值。 #include <iostream&