【問題描述】
給出乙個由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,背單詞的五大訣竅 最重要的一點,就是 如果想比別人成功,就一定要走捷徑。不要期盼自己比別人幸運,也不要指望自己比別人更聰明或者更勤奮。從智力上說,從機遇上說,自己和別人都是差不了多少的,想超過和自己差不多的人,就一定要走捷徑,捷徑,捷徑!背單詞捷徑的第一條,就是 一定要每次都大量地背。因為自己不...