题目链接: 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)相关推荐

  1. 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]且字典 ...

  2. C. Code a Trie(Trie+dfs+贪心)

    C. Code a Trie 大佬题解,代码基本就是抄的 对于每一个值计算所有串的LCA,也就是最长公共前缀,将该节点(Trie树的节点)标记,对于这些字符串在LCA下面的点一定不存在(如果存在他们不 ...

  3. F. Paper Grading(Trie树+dfs序+二维数点)

    F. Paper Grading 大佬题解 一般关于前缀的问题基本都是Trie树. 首先将所给字符串建立一棵Trie树,Trie能够解决一个字符串在一个字符串集合中出现的次数,而查询前缀次数只需要找到 ...

  4. CF-557 E. Ann and Half-Palindrome(暴力Trie)

    CF-557 E. Ann and Half-Palindrome(暴力Trie) 题目链接 题意 给定一个字符串,求第K个半回文子串. 半回文串:对于字符串SSS, $S_i == S_{n-i+1 ...

  5. Codeforces633C Spy Syndrome 2 (单词Trie)

    题目链接: Spy Syndrome 2 大致题意 给定一个长度为n的字符串str, 全部由小写字母组成. 接下来给出单词列表, 共包含m个单词, 每个单词由大写和小写字母组成. 字符串str可以保证 ...

  6. 【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 字典 ...

  7. Trie 树实现《圣经》词频统计

    Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...

  8. 51nod 1526 分配笔名(Trie树+贪心)

    建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...

  9. 纪中A组模拟赛总结(2021.7.15)

    成绩 rankrankrank namenamename scorescorescore T1T1T1 T2T2T2 T3T3T3 T4T4T4 212121 lyflyflyf 113113113 ...

最新文章

  1. 如何成为一名专家级的开发人员
  2. mac mysql 安装日志_Mac 安装 MySQL
  3. vue 组件之间函数传递_组件之间相互传递参数
  4. python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
  5. python二分法求方程的根_Python查找函数f(x)=0根的解决方法
  6. new 结构体指针_Go:我应该用指针替代结构体的副本吗?
  7. 理解Java操作数据库原理
  8. java输出的文本内容不对_java 字符串写入文件后再读出不一样? 有什么解决办法吗?...
  9. 【剑指offer】31、栈的压入和弹出序列
  10. jclasslib 插件安装及使用
  11. centos 20T硬盘(超过16T)分区和格式化
  12. 基于ASP.NET的读书网站设计与实现
  13. 设计模式 | 观察者模式及典型应用
  14. iOS开发者问题答疑——买号、关联、刷评论
  15. “硬核”刘强东是怎么炼成的?
  16. 22年的梦想《仙剑奇侠传》
  17. 电视剧中的程序员,是真的敲代码吗?
  18. 2017年7月14日 星期五 --出埃及记 Exodus 28:5
  19. 计算视觉与机器学习类资讯~
  20. 坚守初心,白鹭引擎七年之痒

热门文章

  1. 使用idea将本地项目上传至github及clone
  2. 用证书实现windows 2003下IIS的SSL安全通信
  3. php web表格导出,javascript将web表格导出成excel
  4. 蓝桥杯 ALGO-100 算法训练 整除问题
  5. 蓝桥杯 ADV-77 算法提高 统计平均成绩
  6. python天下第一什么梗_「PHP 是最好的语言」这个梗是怎么来的?
  7. Keepalived 配置实例
  8. Spring mvc创建的web项目,如何获知和修改其web的项目访问链接名称?
  9. 财务与IIT的发展正在质变
  10. [转] 接触C# 反射 2