首页 > 代码库 > 【LA 3942】 Remember the word
【LA 3942】 Remember the word
题意
给定一个字符串和若干个单词,询问能把字符串分解成这些单词的方案数。比如abcd ,有单词a,b,ab,cd:就可以分解成a+b+cd或者ab+cd。
分析
trie树—>DP
代码
(感谢qrc巨神的细心指导,并不是很细心的我竟然也AC了,qrc太巨了!)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MNODE 400000 #define mod 20071027 int trie[MNODE][26],cntnode; bool tag[MNODE]; int dp[300005]; void init(int x,char *s,int i){ if(i==strlen(s)) {tag[x]=1;return;} char c=s[i]; if(!trie[x][c-‘a‘]) trie[x][c-‘a‘]=++cntnode; init(trie[x][c-‘a‘],s,i+1); } int main(){ char s[300005]; int S; int cas=0; while(scanf("%s",s)!=EOF){ memset(trie,0,sizeof(trie)); memset(tag,0,sizeof(tag)); cntnode=1; scanf("%d",&S); char ss[101]; while(S--) scanf("%s",ss),init(1,ss,0); memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<strlen(s);i++){ int now=1; for(int j=i;j<strlen(s);j++){ if(trie[now][s[j]-‘a‘]) now=trie[now][s[j]-‘a‘]; else break; if(tag[now]) dp[j+1]=(dp[j+1]+dp[i])%mod; } } printf("Case %d: %d\n",++cas,dp[strlen(s)]); } return 0; }
【LA 3942】 Remember the word
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。