UVA1401 (字典树加简单dp)

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5+10;
const int mod=20071027;
const int sigma_size=26;
int dp[N];
char str[N];
char s[105];
struct Trie{
    int ch[N][sigma_size];
    int val[N];
    int sz;
    Trie(){sz=1;memset(ch[0],0,sizeof(ch[0]));}
    int idx(char c) {return c-‘a‘;}
    void reset(){memset(ch,0,sizeof(ch));memset(val,0,sizeof(val));sz=1;}
    void insert(char *s,int v)
    {
        int u=0,n=strlen(s);
        for(int i=0;i<n;i++)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    int query(char *s,int a)
    {
        int u=0,res=0;
        for(int i=a;s[i];++i)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
                return res;
            u=ch[u][c];
            if(val[u])
            {
                res+=dp[i+1];
                res%=mod;
            }
        }
        return res;
    }
};
Trie T;
int main()
{
    int kase=0;
    while(scanf("%s",str)!=EOF)
    {
        int n,m=strlen(str);
        scanf("%d",&n);
        T.reset();
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            T.insert(s,1);
        }
        dp[m]=1;
        for(int i=m-1;i>=0;i--)
        {
            dp[i]=T.query(str,i);
        }
        printf("Case %d: %d\n",++kase,dp[0]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hh13579/p/11684839.html

时间: 2024-08-06 01:29:56

UVA1401 (字典树加简单dp)的相关文章

LA、Remember the Word (字典树, 简单dp)

传送门 题意: 给你一个初始串 S,strlen(s) <= 3e5  然后给你 n 个单词. n <= 4000,  每个单词的长度不超过 100 : 问你这个初始串,分割成若干个单词的连接的方案:(这些单词必须是给定的n个单词中的任意一个,一个单词可以被使用多次.) 解: 将 n 个单词建个字典树: dp[ i ] 表示,S的 0 ~ i - 1 切割成若干个 单词的方案数: 枚举S, 枚举到 当前位置 i: 然后就在字典树找,以 S 的 i + 1 开始的, 能不能找到一个单词与之匹配:

Uva1401(字典树)

1401 - Remember the Word Time limit: 3.000 seconds Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a photographic memory and this may not trouble him, Neal gives it to Jiejie. Since Ji

/*字典树*/一些简单题

原理很简单,,,,,肯定能看懂,,,我觉得实现费点劲..... 我的模板: #include <iostream> #include<bits/stdc++.h> using namespace std; #define  MAX  26 typedef struct TrieNode { int nCount;  // 该节点前缀 出现的次数 struct TrieNode *next[MAX]; //该节点的后续节点 } TrieNode; TrieNode Memory[10

字典树的简单实现

Trie树,又称为字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树数据结构. 用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. 它有3个基本性质: 1.根节点不包含字符,除根节点外每一个节点都只包含一个字符. 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串. 3.每个节点的所有子节点包含的字符都不相同. 搜索字典项目的方法为: (1)

Xor Sum(字典树加贪心)

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 457    Accepted Submission(s): 231 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu

uva3942 字典树加dp

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st

递推关系的运用加简单DP【UVA11137Ingenuous Cubrency】-------2015年1月27日

一:题意描述 本题就是求立方数之和.输入正整数n,求将n写成若干个正整数的立方和有多少种方法? 二:问题分析 本题主要的难点就是确定状态.我们可以建立多段图.节点(i,j)表示“使用不超过i的整数的立方,累加和为j“这个状态.设d(i,j)表示为从(0,0)到(i,j)的路径条数,最终答案 是d(21,n).对于这个图而言,每一个节点(i,j)都只能从当前节点(i,j)到达节点(i+1,a*(j+1)^3+j)(a为j+a*(j+1)^3<maxn的常数)所以我们可以写出如下代码: #inclu

LA_3942 LA_4670 从字典树到AC自动机

首先看第一题,一道DP+字典树的题目,具体中文题意和题解见训练指南209页. 初看这题模型还很难想,看过蓝书提示之后发现,这实际上是一个标准DP题目:通过数组来储存后缀节点的出现次数.也就是用一颗字典树从后往前搜一发.最开始觉得这种搞法怕不是要炸时间,当时算成了O(N*N)毕竟1e5的数据不搞直接上N*N的大暴力...后来发现,字典树根本跑不完N因为题目限制字典树最多右100层左右. 实际上这道题旧思想和模型来说很好(因为直观地想半天还真想不出来..)但是实际实现起来很简单--撸一发字典树就好了

字典树详解

字典树概述    字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 例题: NKOJ 1934 外地人     你考入大城市沙坪坝的学校, 但是沙坪坝的当地人说着一种很难懂的方言, 你完全听不懂. 幸好你手中有本字典可以帮你. 现在你有若干个听不懂的方言需要查询字典.输入