3942 - Remember the Word

思路:字典树+dp

dp[i]前i个字符,能由给的字串组成的方案数,那么dp[i] = sum(dp[i-k]);那么只要只要在字典树中查看是否有字串str[i-k+1,i]就行了;

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<stdlib.h>
4 #include<queue>
5 #include<iostream>
6 #include<string.h>
7 #include<math.h>
8 using namespace std;
9 typedef long long LL;
10 struct node
11 {
12 node *p[26];
13 bool flag;
14 node()
15 {
16 memset(p,0,sizeof(p));
17 flag = false;
18 }
19 };
20 char str[300005];
21 char ans[300];
22 char bns[300];
23 node *head;
24 void in(char *c,int l);
25 void ask(char *c,int k,int l);
26 LL dp[300005];
27 const LL mod = 20071027;
28 void fr(node *q);
29 int main(void)
30 {
31 int i,j;
32 int __ca = 0;
33 while(scanf("%s",str)!=EOF)
34 {
35 int l = strlen(str);
36 int n;
37 scanf("%d",&n);
38 head = new node();
39 while(n--)
40 {
41 scanf("%s",ans);
42 int k = strlen(ans);
43 in(ans,k);
44 }
45 memset(dp,0,sizeof(dp));
46 dp[0] = 1;
47 for(i = 0; i < l; i++)
48 {
49 int x = max(0,i-100);
50 int v = 0;
51 for(j = i; j >= x; j--)
52 {
53 bns[v++] = str[j];
54 }
55 bns[v] = '\0';
56 ask(bns,i+1,v);
57 }
58 fr(head);
59 printf("Case %d: ",++__ca);
60 printf("%lld\n",dp[l]);
61 }
62 return 0;
63 }
64 void in(char *c,int l)
65 {
66 int i,j;
67 node *root = head;
68 for(i = l-1; i >=0; i--)
69 {
70 int x = c[i]-'a';
71 if(root->p[x]==NULL)
72 {
73 root->p[x] = new node();
74 }
75 root = root->p[x];
76 }
77 root->flag = true;
78 }
79 void ask(char *c,int k,int l)
80 {
81 int i,j;
82 node *root = head;
83 for(i = 0; i < l; i++)
84 {
85 int x = c[i]-'a';
86 if(root->p[x]==NULL)
87 {
88 return ;
89 }
90 else if(root->p[x]->flag)
91 {
92 dp[k] = dp[k] + dp[k-i-1];
93 dp[k]%=mod;
94 }
95 root = root->p[x];
96 }
97 }
98 void fr(node *q)
99 {
100 int i,j;
101 for(i = 0; i < 26; i++)
102 {
103 if(q->p[i])
104 {
105 fr(q->p[i]);
106 }
107 }
108 free(q);
109 }

3942 - Remember the Word的更多相关文章

  1. UVALive - 3942 Remember the Word[树状数组]

    UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...

  2. UVALive - 3942 Remember the Word[Trie DP]

    UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...

  3. 【暑假】[实用数据结构]UVAlive 3942 Remember the Word

    UVAlive 3942 Remember the Word 题目: Remember the Word   Time Limit: 3000MS   Memory Limit: Unknown   ...

  4. LA 3942 Remember the Word(前缀树&树上DP)

    3942 - Remember the Word Neal is very curious about combinatorial problems, and now here comes a pro ...

  5. UVALive 3942 Remember the Word 字典树+dp

    /** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...

  6. Trie + DP LA 3942 Remember the Word

    题目传送门 题意:(训练指南P209) 问长字符串S能由短单词组成的方案数有多少个 分析:书上的做法.递推法,从后往前,保存后缀S[i, len-1]的方案数,那么dp[i] = sum (dp[i+ ...

  7. UVA - 1401 | LA 3942 - Remember the Word(dp+trie)

    https://vjudge.net/problem/UVA-1401 题意 给出S个不同的单词作为字典,还有一个长度最长为3e5的字符串.求有多少种方案可以把这个字符串分解为字典中的单词. 分析 首 ...

  8. UVAL 3942 Remember the Word(递推+Trie)

    Remember the Word [题目链接]Remember the Word [题目类型]递推+Trie &题解: 蓝书P209,参考的别人公开代码 &代码: #include ...

  9. UVa Live 3942 Remember the Word - Hash - 动态规划

    题目传送门 高速路出口I 高速路出口II 题目大意 给定若干种短串,和文本串$S$,问有多少种方式可以将短串拼成长串. 显然,你需要一个动态规划. 用$f[i]$表示拼出串$S$前$i$个字符的方案数 ...

随机推荐

  1. 学习java第十九天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  2. Spark基础:(四)Spark 数据读取与保存

    1.文件格式 Spark对很多种文件格式的读取和保存方式都很简单. (1)文本文件 读取: 将一个文本文件读取为一个RDD时,输入的每一行都将成为RDD的一个元素. val input=sc.text ...

  3. 零基础学习java------32---------css,javascript,jQuery

    一. CSS简单了解 需要掌握: 概念见day11中的课堂笔记 css:修饰html标签的样式 1.每个元素有一个style属性,其形式为:style="属性:值:属性:值...." ...

  4. 【leetcode】721. Accounts Merge(账户合并)

    Given a list of accounts where each element accounts[i] is a list of strings, where the first elemen ...

  5. android studio 编译NDK android studio 生成.so文件

    详细配置使用请移步:https://www.jianshu.com/p/4c7d9a10933b android studio NDK 编译 第一步: app/build.gradle下面 添加代码: ...

  6. RHEL 6.5 安装ORACEL11gR2

    1.关闭selinux,用vi /etc/selinux/config selinux=disabled 2.使用yum安装rpm yum -y install compat-db compat-db ...

  7. String 、StringBuffer、StringBuilder的区别

    String:字符串常量 StringBuffer:字符串变量:线程安全的 StringBuilder:字符串变量:线程非安全的 三者执行速度比较:StringBuilder >  String ...

  8. 深入浅出 Docker

    一.什么Docker 从作用的角度: Docker是一个为开发人员和系统管理员开发.迁移和运行应用程序的平台.应用程序通过Docker打包成Docker Image后,可以实现统一的方式来下载.启动. ...

  9. Redis增加测试数据

    目录 一.简介 二.操作 三.制造测试数据 一.简介 用shell脚本将文本内容挨个写到redis中效率是很慢的.打开一个链接,写入后再关闭,再打开,效率很低. redis支持pipe mode功能, ...

  10. 【js基础】基础数据类型变量为啥有属性?

    1.变量和数值 let a =1 这是一个简单的变量声明,其中"a"是变量,在代码中供程序员或者语法操作的,而1是数值,是我最终需要的东西.为什么不直接使用数值而使用变量?这个就不 ...