洛谷 P2031 脑力达人之分割字串

来源:互联网 发布:规范查询软件 编辑:程序博客网 时间:2024/05/17 01:53

题目描述
现在有一个字符串,你可以对这个字符串进行拆分,如abcvsdaas可以拆分为abc|vs|d|aasa,现在再给你一个字典,要求分割成的每一个子串必须要有包含其中的任意一个单词。那么最多可以分为几个子串呢?


【题目分析】
随机跳题,跳到一道水题,动态规划+trie树。


【代码】

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int t[150001][30],root=1,cnt=1;int end[150001],f[301],n,l1,l2;char s1[301],s2[301];void insert(){    int now=root; scanf("%s",s2+1); l2=strlen(s2+1);    for (int i=1;i<=l2;++i)    {        if (!t[now][s2[i]-'a']) t[now][s2[i]-'a']=++cnt;        now=t[now][s2[i]-'a'];    }    end[now]++;}void dp(){    memset(f,0,sizeof f);    f[0]=0;l1=strlen(s1+1);    for (int i=1;i<=l1;++i)    {        f[i]=max(f[i-1],f[i]);        int now=1,p=i;        while (now)        {            now=t[now][s1[p]-'a'];            if (end[now]) f[p]=max(f[p],f[i-1]+1);            p++;        }    }    int ans=0;    for (int i=1;i<=l1;++i) ans=max(ans,f[i]);    printf("%d\n",ans);}int main(){    scanf("%s",s1+1);    scanf("%d",&n);    for (int i=1;i<=n;++i) insert();    dp();}
0 0
原创粉丝点击