題解 薇爾莉特的打字機

2022-01-10 02:31:17 字數 1088 閱讀 4653

首先,這題需要處理字串,我們用 trie分析

先忽略刪除操作

拿樣例 1 舉個例子:

首先把最開始的字串插入到樹中

然後薇爾莉特打了乙個字元 a

此時可以插入或者是不插入,就會有這樣的情況:

不插入時,之前插入進去的字元均可以作為字串的結尾

假設之前插入了 x個字母,每乙個字母都可以作為串的結尾

現在插入這個字元,總數似乎又增加了 x個

繼續看樣例 1,此時薇爾莉特又打了乙個字元 a

此時把它插入樹中,就是這樣:

此時能作為串的結尾的數仍然只有 a,重複了

所以如果新產生的可以作為結尾的節點

那麼沒有可以作為結尾的節點和這個節點相同

可能說的有點繞,舉個例子:

假如 a已經存在於這棵樹中並且可以作為結尾

那麼再插入乙個 a不能增加可以作為結尾節點的數量

令 ans表示插入之前可以作為結尾節點的節點數量

新插入的字元為 x

fi表示已經有第 i種字元的可以作為結尾節點的總數

我們可以算出現在的 ans=之前的 ans×2-fch,fch=原來的 ans

接下來是刪除部分

此時我們已經插入了這幾個節點:

刪除的過程其實就是去掉當前節點往上跳的過程

比如說刪除當前的 a之後就是這樣:

刪除了這個節點往上跳,上面的節點一定是可以作為結尾節點的節點

所以此時新產生的結果只有 1,加 1 即可

模擬 trie的操作,直接遞推就好了

ps:道路我都懂,可是為什麼模數是這麼奇怪的數(可能是我太菜了,還不懂什麼意思)

ac**:

#include using namespace std;

const int mod = 19260817;

int n, m;

int f[100];

char s[5000002];

int main()

} else

}cout << ans;

return 0;

}

薇爾莉特的打字機題解

好題 就是我死活想不到,看題解後卻不得不佩服思路巧妙的題 我們將一種字串看做乙個點 每一次操作就是對所有存在的點進行拓展 不按,狀態不變 按下,狀態增加 這就是先按a後按b的例子。1.輸入乙個字母 所有子樹中沒有此字母的點會增加,所以我們用乙個陣列 f x 記載沒有此字母 x 的點數 之後,原來的所...

P4965 薇爾莉特的打字機

只要客人有意向,不論身在何處,都能上門服務。我是自動手記人偶服務 薇爾莉特 伊芙加登。薇爾莉特的打字機用了太久,按鍵已經開始老化了,因此有時候按鍵會沒有反應。而薇爾莉特總是盲打,因此按鍵沒反應她也不會注意到。一天,她用這台打字機繼續完成一封還沒寫完的信。現在告訴你這封信已經寫好的部分以及薇爾莉特想進...

洛谷4965 薇爾莉特的打字機(Trie,DP)

神仙題。考慮在一棵 trie 上進行染色,將可能出現的串的末尾染成黑色。答案就是黑點的個數。一開始只有 a 的末尾點是黑色。當出現乙個字元 不是退格 c 時,就要將每個黑點的 c 兒子都染成黑色。然而這樣乙個點可能會有重複染色,不能直接乘 2 不妨記錄乙個 f c 表示有兒子 c 且該兒子是黑色的點...