vijos 1951 玄武密碼

2021-07-03 16:02:09 字數 1205 閱讀 6213

題意:

給出乙個匹配串和n個單詞;

求每個單詞在匹配串中出現的的最大字首長度;

匹配串長度<=10^7,n<=10^5,單詞長度<=100;

題解:當年啥也不會天真的一發kmp騙掉了50分,然後看題解說是自動機感覺好神啊;

現在回來複習自動機就把這道題切了試試;

基本的建立自動機什麼的不說了;

主要就是答案的處理上我是在trie樹上記錄乙個is的陣列;

然後每個和匹配串匹配到了的結點全都標記上;

(當然這裡要把fail指標的一連串的字尾相同的結點標記)

最後和建樹時一樣掃一遍自動機,每個單詞標記的最大字首長度就是答案;

建樹和找答案的複雜度是o(100n),自動機匹配大概是o(10^7)左右咯;

有個小優化,找字尾時發現已經標記的就可以退出了,因為後面一定也被標記完成了;

大概可以省500ms;

還有一點。。。因為匹配串很長字符集很少單詞很短;

所以大隨機資料可以視為單詞全在匹配串中從而可能騙掉4個點233333(orz gaoj,思路太神);

**:

#include#include#include#include#define n 100001

#define m 10000001

using namespace std;

queueq;

int fail[m], next[m][4], root, tot = 1;

char str[m], a[n][101];

bool is[m];

int f(char a)

}void insert(char *s)

}void build()

temp = fail[temp];

}if (!temp) fail[next[p][i]] = root;

q.push(next[p][i]);

}} }

}void query(char *s)

s++; }}

void slove(char *s)

printf("%d\n", ret);

}int main()

build();

query(str);

for (i = 1; i <= n; i++)

return 0;

}

JSOI2012 玄武密碼

傳送 這道題就是乙個sam的水題 所以這也是一篇很水的部落格 我們建完sam後,把每乙個串放上去跑就行了。因為題目要求字首匹配,所以一旦失配,就直接返回了。include include include include include include include include include ...

AC自動機 玄武密碼

題目鏈結 題意 對於每一段文字,其字首在母串上的最大匹配長度是多少呢 參考別人的題解 我們只需要先建立所有密碼的trie樹 再以母串為主串跑乙個ac自動機 不過其中還是有一些需要改動的地方 原本字典樹中用來記錄某個節點是不是字串結尾的陣列不需要,直接刪去 我們需要另乙個陣列來標記哪些點被匹配 跑完a...

BZOJ 4327 JSOI2012 玄武密碼

字尾自動機裸題。藉著這道裸題總結一下字尾自動機的查詢問題。1.查字首 查詢時不跳parent,遇到空節點就跳出。2.查子串 查詢時跳parent,記錄最大ans.3.查次數 lct維護right陣列 4.查不同的串的數目 在建樹時維護,乙個點對答案的貢獻為this max len this pare...