hdu4843(NOI2000) 古城之谜 (trie树+DP)】的更多相关文章

Description 著名的考古学家石教授在云梦高原上发现了一处古代城市遗址.让教授欣喜的是在这个他称为冰峰城(Ice-Peak City)的城市中有12块巨大石碑,上面刻着用某种文字书写的资料,他称这种文字为冰峰文.然而当教授试图再次找到冰峰城时,却屡屡无功而返.幸好当时教授把石碑上的文字都拍摄了下来,为了解开冰峰城的秘密,教授和他的助手牛博士开始研究冰峰文,发现冰峰文只有陈述句这一种句型和名词(n).动词(v).辅词(a)这三类单词,且其文法很简单: ::= { } ::= ::={ }[…
学习Trie树中,所以上网搜一下Trie树的题,找到这个,人家写着是简单dp,那我就想着能学习到什么Trie树上的dp,但最后发现根本好像跟Trie树没有什么联系嘛... 题意就是给你很多个字符串(长度<20),然后如果两个字符串在排序完后,左边的一个+一个字符能变成右边的,这两个字符串连上一条边,然后求最长的边.我想了半天怎么跟Trie不搭边... 一个自然的想法是这样的,记d[i]为序号为i的字符串作为结束字符串的最长长度,我先把所有字符串根据长度由小到大排序,然后对每个字符串k,我每次把起…
题意: 给出一个由多个不同单词组成的字典,和一个长字符串,把这个字符串分解成若干个单词的连接,问有多少种方法; 思路: dp[i]表示s[i,L]的方案数,d[i]=∑d[j];s[i,j-1]是一个字典里的单词; 一开始想用mp搞,最后t了;换成了trie树,由于单词的长度不超过100,所以就可以在trie树查找不超过100的长度,把出现单词结点的累加;dp[0]就是答案了; AC代码: #include <iostream> #include <cstdio> #include…
[1222] English Game 时间限制: 1000 ms 内存限制: 131072 K 问题描写叙述 This English game is a simple English words connection game. The rules are as follows: there are N English words in a dictionary, and every word has its own weight v. There is a weight if the co…
Trie树基础题,记录下代码. #include <cstdio> #include <cstring> #define MaxNode 4005*100 #define NodeSize 26 #define MOD 20071027 char givenword[300005]; int ans[300005]; int next[MaxNode][NodeSize]; class Trie{ public: int val[MaxNode]; int sz; Trie(){…
题目描述 给定 n 和 n 个信息,每个信息包含一个词性 a (只有三种:名,动,辅)和对应的词 mot ,形为" \(a.mot\) ".(一次可能多词性) 最后给一个长度不大于 \(5KB\) 的冰峰文文章,将这篇冰峰文文章划分为最少的句子,在这个前提下,将文章划分为最少的单词时,求划分的句子数量和单词数量. 划分标准: (别问我为什么盗图.. \(1\leq n\leq 10^3\ \ \ \ mot.len\leq 20\) \(solution\) 首先要搞懂题目中的图是什么…
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的集合. 我们称一段文章T在某个字典D下是可以被理解的,是指如果文章T可以被分成若干部分,且每一个部分都是字典D中的单词. 例如字典D中包括单词{‘is’, ‘name’, ‘what’, ‘your’},则文章‘whatisyourname’是在字典D下可以被理解的 因为它可以分成4个单词:‘wha…
题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串. UVa1401,一个道理..dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移. #include<cstdio> #include<cstdlib> using namespace std; #define MAXN 2222*2000 ],from[MAXN],to[MAXN]; ],S[]; ],rec[]; void pnt(int x){ ) retur…
题目给定一个字符串集合有几种方式拼成一个字符串. dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符串构造一棵Trie树,然后就可以在线性时间判断哪几个前缀字符串在集合里. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ][],tn; ]; void insert(c…
Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修改操作就是先查询这个区间1的数量,排序本质上就是把1一起放在这个区间前面或后面,最后查询每个位置,如果为1并且没有被标记过,就标记成当前枚举的字母即可. 将看似复杂的问题转化为了简单的区间修改和查询QAQ 不过需要各种常数优化才能过QAQ Code #include<bits/stdc++.h>…