LA3942 背單詞 trie樹 簡單動規)

2021-07-28 04:20:04 字數 1318 閱讀 6810

【問題描述】

給出乙個由s個不同單詞組成的字典和乙個長字串。把這個字串分解成若干個單詞的連線(單詞可以重複使用),有多少種方法?

比如4個單詞:,則」abcd」有兩種分解方法:」a」+」b」+」cd」 或 「ab」+」cd」。

【輸入格式】

第一行為長字串(僅由小寫字母組成)。

第二行乙個整數n,表示字典包含的單詞數。以下n行,每行為乙個單詞。

【輸出格式】

輸出長字串的分解方案數除以 20071027 的餘數。

【輸入樣例】

abcd

4 a

b cd

ab【輸出樣例】

【樣例解釋】

時間限制:1秒 記憶體限制:64m

【資料範圍】

n<=40000

長字串長度不超過1 000 000,每個單詞長度不超過100。

【**】

大白書209頁,la3942

建立一棵trie樹然後在原字串上進行簡單的動態規劃就可以了。

d(i)完成了前i-1個字母有多少中情況。

以每乙個字母為起點,在trie樹上找有沒有對應的單詞,比如說i到j個字母為乙個單詞,d(j)=d(j)+d(i),這樣就可以得出答案了。

詳細**如下:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=2000005;

const

int mod=20071027;

int ch[maxn][26]=,cnt=0,n,root=0,m;

bool vis[maxn]=;

char s[1000005],c[105];

int d[1000005];

void in()//建trie樹

int k=c[i]-'a';

if(!ch[p][k]) ch[p][k]=++cnt;

p=ch[p][k];

i++;

}}void work(int i)

int k=s[i]-'a';

p=ch[p][k];

if(!p) break;//一定要記得break,沒有找的就跳出來

i++;

}}int main()

d[0]=1;

m=strlen(s);

for(int i=0;i//動規

cout

0;}

LA 3942 背單詞(字首樹Trie dp)

給出乙個由s個不同的單詞組成的字典和乙個長字串。把這個字串分解成若干個單詞的連線 單詞可以重複使用 有多少種方法?比如 有4個單詞a,b,cd,ab,則abcd有兩種分解方法 a b cd和ab cd。輸入格式 多組資料,每組資料第一行為小寫字母組成的待分解字串,長度l不超過300000.第二行為單...

字串處理 Tire樹 LA3942

其實trie樹並沒有聽上去那麼高階。首先它是把所有的單詞存到了一棵樹裡面,說白了,就是按照乙個單詞的字首來存。不過這棵樹不需要按照嚴格意義上的樹來了,實際上,只需要用ch u i 來存就好了,而ch u i 代表的就是整棵樹,ch u i 的值為樹的節點值,即時遍歷的時間戳。u代表的是當前節點值,c...

背單詞訣竅

1,背單詞的五大訣竅 最重要的一點,就是 如果想比別人成功,就一定要走捷徑。不要期盼自己比別人幸運,也不要指望自己比別人更聰明或者更勤奮。從智力上說,從機遇上說,自己和別人都是差不了多少的,想超過和自己差不多的人,就一定要走捷徑,捷徑,捷徑!背單詞捷徑的第一條,就是 一定要每次都大量地背。因為自己不...