题意
给定一个字符串和若干个单词,询问能把字符串分解成这些单词的方案数。比如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; }
时间: 2024-10-15 14:36:58