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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 高通 linux_linux驱动开发教程

    高通 linux_linux驱动开发教程笔记:调试步骤:1.BLSPcheck:主要确认GPIO功能和BLSP通道2.pinctrl文件配置3.平台设备树文件配置4.时钟文件修改5.添加从设备:1 设备树注册方法2 设备数节点创建一、I2C配置1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例。2.根据MSM8937DEV

    2022年10月8日
    0
  • 详解stacking过程

    翻到之前自己写的这篇博客,感觉写的还是不够简洁明了,特地回来改一下,顺便文末附上Kaggle内相关操作的代码,希望能够帮助学习的同学能够瞬间理解stacking这个概念。stacking:stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。sta…

    2022年4月6日
    124
  • 《Java编程思想》总结

    《Java编程思想》总结语言实际上是帮助程序员更容易地操作计算机的工具,选择何种语言来编程,是Java还是C++,本质上相当于“选择腾讯视频还是优酷视频来观看电视节目(那么选择汇编语言就是选择了电视机)”。正如腾讯视频是腾讯公司的产品,Java是美国公司Sun的产品。希望读者能明白:语言只是工具。

    2022年7月9日
    20
  • bwapp详细教程_APP总结报告怎么做

    bwapp详细教程_APP总结报告怎么做bWAPP玩法总结2018-08-082018-08-0815:12:43阅读16K0bWAPP(buggywebApplication)是一个集成了了常见漏洞的web应用程序,目的是作为漏洞测试的演练场(靶机),为web安全爱好者和开发人员提供一个测试平台,与webgoat、dvwa类似。环境搭建bWAPP有两种安装方式,可以单独安装,部署到apache+php+mysql的环境;也可以安装虚拟机版本bee-box,区别在于虚拟机版本能够测试的漏洞更多,比如破壳漏洞

    2022年9月23日
    0
  • centos7.6安装docker_docker 生产环境

    centos7.6安装docker_docker 生产环境前言前面一篇学了mac安装docker,这篇来学习在linux上安装docker环境准备Docker支持以下的CentOS版本,目前,CentOS仅发行版本中的内核支持Docker。Doc

    2022年7月30日
    2
  • 最长回文子串——马拉车算法详解

    最长回文子串——马拉车算法详解马拉车算法(Manacher‘sAlgorithm)是用来解决求取一个字符串的最长回文子串问题的。此算法充分利用了回文字符串的性质,将算法复杂度降到了线性,非常值得一学。我将网上所有讲解马拉车算法的文章基本看了一遍,总结出了最通俗易懂的介绍,同时用python进行了实现。题目给定一个字符串s,找到s中最长的回文子字符串。所谓回文字符串,指的是无论从左往右读还是从右往左读,…

    2022年6月12日
    50

发表回复

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

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