看完題目,應該很多人都跟我一樣想——有多個單詞,肯定是字典樹嘛。
不錯,就是字典樹,原汁原味的字典樹,先把所有單詞建一棵字典樹,然後放到文字串裡面匹配就好了,不過要注意,有些單詞可能是其它單詞的字首,所以不能過一次就算了,要列舉多種不同的單詞拼起來的情況,但是如果直接列舉單詞的話,別看他n只有20,時間上絕對不行,我們可以發現,如果與文字串匹配不成功的單詞,其實我們就不需要列舉了,我們只需要用字典樹先進行匹配,假如有乙個單詞匹配成功了,那麼我們就以此為分割點,文字串後面的字元從頭匹配,看看最遠可以擴充套件到**就好了,對於這個,我們可以用記憶化搜尋來做。
**如下:
#include #include int n,m,len=0,ans;
struct node};
node tree[210];
inline int ch(char x)//將a~z轉成1~26來存
char wbc[1050000];
void build(char ss,int x)//構建字典樹
while(m--)
}
AC 自動機 HNOI2004 L語言
題目鏈結 思路挺簡單的,就是每次在fail樹上跳都是往乙個字首,且說明從a i 結尾的乙個字尾和這個字首匹配上了,如果這個字首是乙個單詞的話,我們就看除去匹配上的字尾的剩餘部分是不是匹配上了 是的話,就說明前i長的句子都是由單詞組成的 不知道為啥,這些ac自動機的題做起來都覺得挺簡單的 includ...
題解 P2292 HNOI2004 L語言
這到題一眼看去,似乎就是個ac自動機,然後迅速的打出了ac自動機的板子。最開始我想的是,不就判斷一下長度就行了嗎,把每乙個單詞的長度求出來,在ac自動機的時候每次用當前位置的下標減去單詞長度,如果小於等於目前的字首長度,就更新答案,然後迅速地打出 發現只有70分,仔細思考了一下,發現是因為我沒有讀清...
洛谷 P2292 HNOI2004 L語言
ac自動機 dp 洛谷這題資料加強之後用bfs t了最後一兩個點 用了乙個dp陣列做轉移 注意一下字串下標的偏移 因為有了dp陣列 存下trie樹上的結尾結點的字串長度 注意一下ac自動機的空間和dp陣列的空間 其他就沒啥了 include include include include inclu...