題解 P2292 HNOI2004 L語言

2022-06-20 20:24:10 字數 933 閱讀 9146

這到題一眼看去,似乎就是個ac自動機,然後迅速的打出了ac自動機的板子。

最開始我想的是,不就判斷一下長度就行了嗎,把每乙個單詞的長度求出來,在ac自動機的時候每次用當前位置的下標減去單詞長度,如果小於等於目前的字首長度,就更新答案,然後迅速地打出**,發現只有70分,仔細思考了一下,發現是因為我沒有讀清題目,單詞不能有重複,比如如果單詞是she element 的話,那麼shelement的字首應該是3,照我這個思路的話算出來是9,所以這個思路還有一些問題。

剛才的思路其實大致方向是沒有什麼問題的,只需要在多考慮一種情況就是了,接下來該如何考慮這種情況,對於乙個最長字首,我們可以把它劃分為許多種不同的單詞組成的乙個字串,那麼就會有很多種方案,我們只需要將每種方案記錄一下即可,那麼如何記錄?考慮再開乙個陣列vis,表示是否存在長度為i的合法字首,

那麼這個問題就迎刃而解了。

具體結合**理解

#include#include#include#includeusing namespace std;

const int n = 2e6 + 5;

char str[n];

int tr[n][26], cnt[n], net[n], idx;

bool vis[n];

queueq;

void insert()

cnt[p] = strlen(str);//cnt存的是每個單詞的長度

}void build()}}

}int main()

build();//ac自動機板子,就不解釋了

while (m--)

p = net[p];

}if (vis[i + 1])

len = i + 1;//記錄一下答案

}printf("%d\n", len);

}return 0;

}

洛谷 P2292 HNOI2004 L語言

ac自動機 dp 洛谷這題資料加強之後用bfs t了最後一兩個點 用了乙個dp陣列做轉移 注意一下字串下標的偏移 因為有了dp陣列 存下trie樹上的結尾結點的字串長度 注意一下ac自動機的空間和dp陣列的空間 其他就沒啥了 include include include include inclu...

洛谷 P2292 HNOI2004 L語言

標點符號的出現晚於文字的出現,所以以前的語言都是沒有標點的。現在你要處理的就是一段沒有標點的文章。一段文章t是由若干小寫字母構成。乙個單詞w也是由若干小寫字母構成。乙個字典d是若干個單詞的集合。我們稱一段文章t在某個字典d下是可以被理解的,是指如果文章t可以被分成若干部分,且每乙個部分都是字典d中的...

題解 P2285 HNOI2004 打鼴鼠

現在知道在一段時間內,鼴鼠出現的時間和地點,請編寫乙個程式使機械人在這一段時間內打死盡可能多的鼴鼠。首先,座標為 x,y 到座標為 a,b 的網格需要的時間為 x a y b 由於題目已經自動幫我們按時間排好序了,所以,我們可以直接 dp 考慮揹包 include using namespace s...