51nod1464(trie + dfs)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1464
题意: 中文题诶~
思路: 将所有半回文串构建成一棵字典树, 再 dfs 里面字典序第 k 大的字符串.
注意插入半回文串时不能完全暴力插入, 不然插入的时间复杂度为 O(n^3), 会 tle. 可以先用 dp 预处理一下, dp[i][j] 存储 子串[i, j] 是否为回文串, vis[i] 记录以 i 开头的最长半回文串末尾位置. 那么插入时可以每次插入 [i, vis[i]] 之间的所有半回文串, 时间复杂度为 O(n^2). 然后再 dfs 一下答案即可.
代码:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 const int MAXN = 5e3 + 10; 7 int trie[MAXN * MAXN][2], num[MAXN * MAXN], id = 1; 8 bool dp[MAXN][MAXN];//dp[i][j]存储[i,j] 是否为半回文串 9 int vis[MAXN];//vis[i]存储以i开始的最长半回文串末尾位置 10 char s[MAXN]; 11 12 void init(int len){ 13 for(int i = len - 1; i >= 0; i--){ 14 vis[i] = i; 15 dp[i][i] = true; 16 for(int j = i + 1; j < len; j++){ 17 if(s[i] == s[j]){ 18 if(i + 2 >= j - 2) dp[i][j] = true; 19 else dp[i][j] = dp[i + 2][j - 2]; 20 } 21 if(dp[i][j]) vis[i] = j; 22 } 23 } 24 } 25 26 void insert(int st){ 27 int node = 0; 28 for(int i = st; i <= vis[st]; i++){ 29 int cnt = s[i] - 'a'; 30 if(!trie[node][cnt]) trie[node][cnt] = id++; 31 if(dp[st][i]) num[trie[node][cnt]]++; 32 node = trie[node][cnt]; 33 } 34 } 35 36 int k; 37 string sol; 38 39 void dfs(int x){ 40 string cnt = sol; 41 if(k > 0 && trie[x][0]){ 42 sol += 'a'; 43 k -= num[trie[x][0]]; 44 dfs(trie[x][0]); 45 } 46 if(k > 0 && trie[x][1]){ 47 sol = cnt; 48 sol += 'b'; 49 k -= num[trie[x][1]]; 50 dfs(trie[x][1]); 51 } 52 } 53 54 int main(void){ 55 scanf("%s%d", s, &k); 56 int len = strlen(s); 57 init(len); 58 for(int i = 0; i < len; i++){ 59 insert(i); 60 } 61 dfs(0); 62 cout << sol << endl; 63 return 0; 64 }
View Code
转载于:https://www.cnblogs.com/geloutingyu/p/7672490.html
51nod1464(trie + dfs)相关推荐
- HDU - 6625 three arrays (Trie+dfs)
题目链接 题意 两个数组A.BA.BA.B,数组的顺序随意,你需要得到一个数组CCC,满足C[i]=A[i]xorB[i]C[i] = A[i] xor B[i]C[i]=A[i]xorB[i]且字典 ...
- C. Code a Trie(Trie+dfs+贪心)
C. Code a Trie 大佬题解,代码基本就是抄的 对于每一个值计算所有串的LCA,也就是最长公共前缀,将该节点(Trie树的节点)标记,对于这些字符串在LCA下面的点一定不存在(如果存在他们不 ...
- F. Paper Grading(Trie树+dfs序+二维数点)
F. Paper Grading 大佬题解 一般关于前缀的问题基本都是Trie树. 首先将所给字符串建立一棵Trie树,Trie能够解决一个字符串在一个字符串集合中出现的次数,而查询前缀次数只需要找到 ...
- CF-557 E. Ann and Half-Palindrome(暴力Trie)
CF-557 E. Ann and Half-Palindrome(暴力Trie) 题目链接 题意 给定一个字符串,求第K个半回文子串. 半回文串:对于字符串SSS, $S_i == S_{n-i+1 ...
- Codeforces633C Spy Syndrome 2 (单词Trie)
题目链接: Spy Syndrome 2 大致题意 给定一个长度为n的字符串str, 全部由小写字母组成. 接下来给出单词列表, 共包含m个单词, 每个单词由大写和小写字母组成. 字符串str可以保证 ...
- 【CODE】Unique Paths Word Search (DFS dp 字典树)
目录 62. Unique Paths 63. Unique Paths II 980. Unique Paths III 79. Word Search 212. Word Search II 字典 ...
- Trie 树实现《圣经》词频统计
Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...
- 51nod 1526 分配笔名(Trie树+贪心)
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...
- 纪中A组模拟赛总结(2021.7.15)
成绩 rankrankrank namenamename scorescorescore T1T1T1 T2T2T2 T3T3T3 T4T4T4 212121 lyflyflyf 113113113 ...
最新文章
- 如何成为一名专家级的开发人员
- mac mysql 安装日志_Mac 安装 MySQL
- vue 组件之间函数传递_组件之间相互传递参数
- python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
- python二分法求方程的根_Python查找函数f(x)=0根的解决方法
- new 结构体指针_Go:我应该用指针替代结构体的副本吗?
- 理解Java操作数据库原理
- java输出的文本内容不对_java 字符串写入文件后再读出不一样? 有什么解决办法吗?...
- 【剑指offer】31、栈的压入和弹出序列
- jclasslib 插件安装及使用
- centos 20T硬盘(超过16T)分区和格式化
- 基于ASP.NET的读书网站设计与实现
- 设计模式 | 观察者模式及典型应用
- iOS开发者问题答疑——买号、关联、刷评论
- “硬核”刘强东是怎么炼成的?
- 22年的梦想《仙剑奇侠传》
- 电视剧中的程序员,是真的敲代码吗?
- 2017年7月14日 星期五 --出埃及记 Exodus 28:5
- 计算视觉与机器学习类资讯~
- 坚守初心,白鹭引擎七年之痒