uva 1401 dp+Trie

uva 1401 dp+Trie

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

http://uva.onlinejudge.org/index.php?

option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=4147


题意:给定一个字符串,以及若干单词,求有几种方式能用单词组成字符串 
我先是dp方程推得有问题不知怎么改动搞得卡了非常久,然后就是数组开得太小一直RE

trie数组大小=单词个数*单词长度 

dp[i]为以str[i]开头的后缀的ans。dp[i]=segma(dp[k]),当中k表示str[i…k-1]是一个单词。假设k=len,那么dp[i]++;

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
#define ll long long

const int N =4000*100+100;
const int MOD =20071027;
char str[300019],pat[115];
ll dp[300019];
const int tk=26,tb='a';
int top,tree[N][tk+1],len;
void init()
{
    top=1;
    memset(tree[0],0,sizeof(tree[0]));
}
int sear(char*s,int i)
{
    int cnt=0;
    ll ans=0;
    for(int rt=0;rt=tree[rt][*s-tb] ;++s)
    {
        if(*(s)==0)break;
        cnt++;
        if(tree[rt][tk])//cnt!=tree[rt][tk]表示dp[i..len-1]是一个单词,此时没有添加切割的种数
        {
            if(*(s+1)==0)ans++;
            ans=(ans+dp[i+cnt])%MOD;
                    //////////////////////
        //printf("rt=%d s=%s i=%d cnt=%d dp=%lld\n",rt,str+i+cnt,i,cnt,dp[i]);
        //////////////////////
        }
    }
    return ans;
}
void Insert(char*s, int Rank=0)//Rank为长度
{
    int rt,nxt;
    for(rt=0;*s;rt=nxt,++s,Rank++)
    {
        nxt=tree[rt][*s-tb];
        if(0 == nxt)//nxt!=0的时候就是有公共前缀了。已经在之前做过了,仅仅需继续跳转即可he中插入her,到h,e都是nxt!=0不用插入
        {
            tree[rt][*s-tb]=nxt=top;
            memset(tree[top],0,sizeof(tree[top]));
            top++;
        }
    }
    tree[rt][tk]=Rank;
}
int main()
{
    //freopen("uva1401.txt","r",stdin);
    int n,ncase=1,pos;
    while(scanf("%s",str)!=EOF)
    {
        init();
        pos=0;
        len=strlen(str);
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",pat);
            Insert(pat);
        }
        dp[len]=0;
        for(int i=len-1;i>=0;i--)
        {
            dp[i]=0;
            dp[i]=sear(str+i,i);
        }
        printf("Case %d: %lld\n",ncase++,dp[0]);

    }
    return 0;
}


版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116891.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【13】进大厂必须掌握的面试题-配置管理面试

    Q1。配置管理流程的目标是什么? 配置管理(CM)的目的是通过使开发或部署过程可控和可重复,从而创建更高质量的产品或系统,来确保产品或系统在其整个生命周期中的完整性。CM流程允许对…

    2020年10月21日
  • 研华acdp手机版_generation z

    研华acdp手机版_generation z上帝手中有 N 种世界元素,每种元素可以限制另外 1 种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i]。现在,上帝要把它们中的一部分投放到一个新的空间中去建造世界。为了世界的和平与安宁,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素限制它。上帝希望知道,在此前提下,他最多可以投放多少种世界元素?输入格式第一行是一个整数 N,表示世界元素的数目。第二行有 N 个整数 A[1],A[2],…,A[N]。A[i] 表示第 i 个世界元素能够限制的世界元素的编号。输出格式

    2022年8月11日
  • redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题

    redis缓存雪崩 缓存穿透 缓存击穿如何解决_缓存击穿问题文章目录缓存穿透缓存击穿缓存雪崩缓存穿透数据库中没有这个数据,内存中也没有这个数据简单场景public class demoController { public R selectOrderById(int id){ Object redisObj = ValueOperations.get(Strubg.valueof(id)); if(redisObj != null){ return new R().setCode(200).

    2022年8月8日
  • 2018,我的这一年

    这一年是和自己对话的一年,是矛盾的一年,是抑郁的一年。时间过的很快,2018已经过去很多天了,是时候对过去的这一年进行一个简单的总结了,不管这一年过的如何,在时间的巨轮下,一切都成为过往,成为了生命中的一段经历,若干年后这一段经历或许只剩下一些碎片的回忆,那也没有关系,顺其自然即可! 泰戈尔曾说过:”天空没留下翅膀的痕迹,但我已飞过“。虽然多年之后记忆中很多事情没有了痕迹,但那些事情的确曾经…

    2022年2月27日
  • centos7配置国内yum源

    centos7配置国内yum源1、什么是yum仓库?yum仓库就是使用yum命令下载软件的镜像地址。我们通常使用yuminstall命令来在线安装linux系统的软件,这种方式可以自动处理依赖性关系,并且一次安装所有依赖的软体包,但是经常会遇到从国外镜像下载速度慢,无法下载的情况。那么此时我们就需要把我们的yum源改为国内的镜像。yum的配置文件yum的配置文件在/etc/yum.repos.d目录下…

    2022年6月6日
  • C#编写单片机上位机软件-串口通讯(BMS汽车动力电池管理系统)

    C#编写单片机上位机软件-串口通讯(BMS汽车动力电池管理系统)上位机软件做了有一段时间,本人呕心沥血的作品。之前用python+pyQT5做,主线程特别特别容易闪退,数据重叠等问题,走了很多弯路;后来用VS的C#做,只能说上手很快,调试效果也不错,而且关键是非常非常简单易读,只希望大家不要像我一样,走这么多弯路–想要源码的小伙伴们,欢迎关注点赞三连+留言邮箱哦~华丽的分割线——————————————————————————————–

    2022年5月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号