题目链接: 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 一下答案即可.

代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std; const int MAXN = 5e3 + ;
int trie[MAXN * MAXN][], num[MAXN * MAXN], id = ;
bool dp[MAXN][MAXN];//dp[i][j]存储[i,j] 是否为半回文串
int vis[MAXN];//vis[i]存储以i开始的最长半回文串末尾位置
char s[MAXN]; void init(int len){
for(int i = len - ; i >= ; i--){
vis[i] = i;
dp[i][i] = true;
for(int j = i + ; j < len; j++){
if(s[i] == s[j]){
if(i + >= j - ) dp[i][j] = true;
else dp[i][j] = dp[i + ][j - ];
}
if(dp[i][j]) vis[i] = j;
}
}
} void insert(int st){
int node = ;
for(int i = st; i <= vis[st]; i++){
int cnt = s[i] - 'a';
if(!trie[node][cnt]) trie[node][cnt] = id++;
if(dp[st][i]) num[trie[node][cnt]]++;
node = trie[node][cnt];
}
} int k;
string sol; void dfs(int x){
string cnt = sol;
if(k > && trie[x][]){
sol += 'a';
k -= num[trie[x][]];
dfs(trie[x][]);
}
if(k > && trie[x][]){
sol = cnt;
sol += 'b';
k -= num[trie[x][]];
dfs(trie[x][]);
}
} int main(void){
scanf("%s%d", s, &k);
int len = strlen(s);
init(len);
for(int i = ; i < len; i++){
insert(i);
}
dfs();
cout << sol << endl;
return ;
}

51nod1464(trie + dfs)的更多相关文章

  1. 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)

    博客第一篇写在11月1号,果然die die die die die alone~ 一道不太难的题,白书里被放到排序这一节,半年前用快排A过一次,但是现在做的时候发现可以用字典树加深搜,于是乐呵呵的开 ...

  2. bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

  3. poj 1816 (Trie + dfs)

    题目链接:http://poj.org/problem?id=1816 思路:建好一颗Trie树,由于给定的模式串可能会重复,在原来定义的结构体中需要增加一个vector用来记录那些以该节点为结尾的字 ...

  4. 校内OJ 1128 词链(link)(Trie+DFS)

    1128: 词链(link) 时间限制: 1 Sec  内存限制: 64 MB 提交: 23  解决: 7 [提交][状态][讨论版] 题目描述 给定一个仅包含小写字母的英文单词表,其中每个单词最多包 ...

  5. BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )

    把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...

  6. fjwc2019 D1T3 不同的缩写(dinic+trie+dfs)

    #180. 「2019冬令营提高组」不同的缩写 乍看之下没有什么好的方法鸭.......于是考虑暴力. 长度?二分似乎可行. 于是我们二分最长子串的长度(设为$len$),蓝后暴力查找. 先在每个串内 ...

  7. HDU 6191 Query on A Tree(可持久化Trie+DFS序)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  8. BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)

    背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了... 描述 ...

  9. BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)

    题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...

随机推荐

  1. springboot成神之——mybatis在spring-boot中使用的几种方式

    本文介绍mybatis在spring-boot中使用的几种方式 项目结构 依赖 WebConfig DemoApplication 方式一--@Select User DemoApplication ...

  2. C++加载位图跟SOCKET通信的编写

    //将屏幕信息转换为位图结构 CDC *pDeskDC=GetDesktopWindow()->GetDC();//获取桌面的额画图对象 ; ; CDC memDC;//定义一个内存画布 mem ...

  3. 用Python+Django在Eclipse环境下开发web网站

    一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集,包含了数据库配置.Django详细选项设 ...

  4. 解决"Windows 安装程序不允许从远程桌面连接安装"

    msiexec /i c:\路径\安装程序 例如 msiexec /i c:\TortoiseSVN-1.7.2.22327-x64-svn-1.7.2.msi

  5. Java 计算两个日期相差的天数

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  6. Jquery异步

    一.Jquery向aspx页面请求数据$("#Button1").bind("click", function () { $.ajax({ type: &quo ...

  7. opencv3读取视频并保存为图片

    #include <iostream> #include <vector> #include <opencv2/opencv.hpp> using namespac ...

  8. webservice CXF 相关面试题

    Web Service的优点(1) 可以让异构的程序相互访问(跨平台)(2) 松耦合(3) 基于标准协议(通用语言,允许其他程序访问) 1:WEB SERVICE名词解释.JSWDL开发包的介绍.JA ...

  9. linux删除文件后磁盘空间未释放的问题

    很可能是该文件还被其它进程使用. 使用: lsof | grep deleted | grep $FILE_NAME 可以看到正使用该文件的进程,将之kill即可.也可以查看进程来验证: ls -l ...

  10. Makefile 调试

    一.简介 GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 用来调试makefile 的一个最好方法就是加入调试挂钩以及使用具保护的编程技术,让你能够在事情出错时恢复原状. 二.ma ...