uvalive3942Remember the word

简介: 题意:给出一个单词text,仅仅由小写字母组成,并给出若干个单词word[i],用word[i]去拼接出text,问有多少种方法 分析:典型的Trie的题目。第一次看训练指南的时候套用刘汝佳的模板结果wa(显然我不会用),后来发现很多人都是用指针写的,大部分Trie的题目用指针就能ac,索性自己写...

题意:给出一个单词text,仅仅由小写字母组成,并给出若干个单词word[i],用word[i]去拼接出text,问有多少种方法

分析:典型的Trie的题目。第一次看训练指南的时候套用刘汝佳的模板结果wa(显然我不会用),后来发现很多人都是用指针写的,大部分Trie的题目用指针就能ac,索性自己写了一份使用指针的Trie的模板

代码:

View Code
 1 #include <string.h>
 2 #include <stdio.h>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 #define DEBUG
 7 const int brnum = 26;
 8 struct Trie_node{
 9     Trie_node *br[brnum];        //branches,分支总数
10     int val;            //value of node,一般单词节点为1,非单词节点为0
11     Trie_node():val(0){memset(br, 0, sizeof(br));}
12 };
13 struct Trie{
14     Trie_node* root;
15     Trie(){root=new Trie_node();}
16     int idx(char c){return c-'a';}
17     void insert(const char *s, int v){
18         int n = strlen(s), i;
19         Trie_node* cur = root;
20         for(i=0; i<n; i++) {
21             int c = idx(s[i]);
22             if(!cur->br[c]){
23                 Trie_node *tmp = new Trie_node();
24                 cur->br[c] = tmp;
25                 cur->br[c]->val=0;            //这里改了好久~
26             }
27             cur = cur->br[c];
28         }
29         cur->val = v;
30     }
31     void find_prefixes(const char *s, int len, vector<int>& ans) {
32         Trie_node* cur=root;
33         for(int i=0; i<len; i++) {
34             if(s[i]=='\0') break;
35             int c=idx(s[i]);
36             if(!cur->br[c]) break;
37             cur=cur->br[c];
38             if(cur->val) ans.push_back(cur->val); // 找到一个前缀
39         }
40     }
41 };
42 const int maxl=300000+10; // 文本串最大长度
43 const int maxw=4000+10;   // 单词最大个数
44 const int maxwl=100+10;   // 每个单词最大长度
45 const int MOD=20071027;
46 int d[maxl], len[maxw], n;
47 char text[maxl], word[maxwl];
48 int main() {
49 #ifndef DEBUG
50     freopen("in.txt", "r", stdin);
51 #endif
52     int cas=1, i, j;
53     while(scanf("%s%d", text, &n)!=EOF) {
54         Trie trie;
55         for(i=1; i<=n; i++) {
56             scanf("%s", word);
57             len[i] = strlen(word);
58             trie.insert(word, i);
59         }
60         memset(d, 0, sizeof(d));
61         int L=strlen(text);
62         d[L]=1;
63         for(i=L-1; i>=0; i--) {
64             vector<int> p;
65             trie.find_prefixes(text+i, L-i, p);
66             for(j=0; j<p.size(); j++)
67                 d[i]=(d[i]+d[i+len[p[j]]])%MOD;
68         }
69         printf("Case %d: %d\n", cas++, d[0]);
70     }
71     return 0;
72 }

不过这题的dp第一次做的时候没看懂刘汝佳的公式,第二次做才搞懂。。

目录
相关文章
|
计算机视觉
OpenCV滑动条(createTrackbar()函数)如何在多个维度进行同步调整?
这篇文章介绍了如何在OpenCV中使用`createTrackbar()`函数创建多个滑动条以同步调整图像的多个维度(如亮度和对比度),通过将不同滑动条的回调函数合并为一个,确保它们在同一图像基础上进行调整。
|
弹性计算 安全 网络安全
阿里云服务器租用流程,四种阿里云服务器租用方式图文教程参考
阿里云服务器可以通过自定义租用、一键租用、云市场租用和活动租用四种方式去租用,不同的租用方式适合不同的用户群体,例如我们只是想租用一款配置较低且可以快速部署应用的云服务器,通常可以选择一键租用或者云市场租用,本文为大家展示不同租用方式的适合对象以及租用流程,以供初次租用阿里云服务器的用户参考和选择。下面是阿里云服务器租用的图文操作步骤。
11666 2
|
IDE Java 应用服务中间件
Java“ClassNotFoundException”解决
Java中的“ClassNotFoundException”表示JVM找不到指定的类。解决方法包括:确保类路径正确、检查依赖是否完整、确认类名无误、清理和重新构建项目等。
2688 0
|
数据采集 JSON 监控
Zabbix物联网可视化开发文档
Zabbix物联网可视化开发文档
313 1
|
Java
HDU-2120-Ice_cream's world I
HDU-2120-Ice_cream's world I
75 0
|
机器学习/深度学习 人工智能 算法
开源中文医疗大模型华佗GPT来了,真人医生盲测效果优于ChatGPT
开源中文医疗大模型华佗GPT来了,真人医生盲测效果优于ChatGPT
1212 0
|
算法 定位技术
The Unique MST(最小生成树的唯一路径)
The Unique MST(最小生成树的唯一路径)
152 0
|
消息中间件 缓存 NoSQL
Java面试题 -系统解决方案
Java面试题 -系统解决方案
146 0
|
JavaScript
总结 vue3 的一些知识点:​Vue.js 条件语句​
总结 vue3 的一些知识点:​Vue.js 条件语句​
|
人工智能 API Python
太牛逼了!用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
太牛逼了!用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
太牛逼了!用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!