1464 半回文
2016-05-07 16:51
316 查看
1464 半回文
题目来源:
CodeForces
基准时间限制:1 秒 空间限制:262144 KB 分值: 40
难度:4级算法题
收藏
关注
一个字符串t是半回文的条件是,对于所有的奇数i(1≤i≤|t|+12),ti = t|t| − i + 1 始终成立,|t|表示字符串t的长度。下标从1开始。例如"abaa",
"a", "bb", "abbbaa"都是半回文,而"ab", "bba"和"aaabaa"则不是。
现在有一个字符串s,只由小写字母a,b构成,还有一个数字k。现在要求找出s的半回文子串中字典序排在第k位的串,字符串可以是一样,只要所在的位置不同就是不一样的串。
样例解释:
这个样例中半回文子串是 a, a, a, a, aa, aba, abaa, abba, abbabaa, b, b, b, b, baab,bab, bb, bbab, bbabaab (按照字典序排序).
Input
Output
Input示例
Output示例
题目来源:
CodeForces
基准时间限制:1 秒 空间限制:262144 KB 分值: 40
难度:4级算法题
收藏
关注
一个字符串t是半回文的条件是,对于所有的奇数i(1≤i≤|t|+12),ti = t|t| − i + 1 始终成立,|t|表示字符串t的长度。下标从1开始。例如"abaa",
"a", "bb", "abbbaa"都是半回文,而"ab", "bba"和"aaabaa"则不是。
现在有一个字符串s,只由小写字母a,b构成,还有一个数字k。现在要求找出s的半回文子串中字典序排在第k位的串,字符串可以是一样,只要所在的位置不同就是不一样的串。
样例解释:
这个样例中半回文子串是 a, a, a, a, aa, aba, abaa, abba, abbabaa, b, b, b, b, baab,bab, bb, bbab, bbabaab (按照字典序排序).
Input
单组测试数据。 第一行有一个字符串s(1 ≤ |s| ≤ 5000),只包含'a' 和 'b',|s|表示s的长度。 第二行有一个正整数k。k不超过s子串中是半回文串的总数目。
Output
输出排在第k位的半回文子串。
Input示例
abbabaab 7
Output示例
abaa
/* *********************************************** Author :xdlove Created Time :2016年05月07日 星期六 15时49分30秒 File Name :2016_05_06_51nod_1464.cpp ************************************************ */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <memory.h> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int N = 5005; char s ; int k,n,l,r; bool dp ; int vis ; string ans; struct Tree { Tree() { val = 0; memset(next,0,sizeof next); } int val; Tree *next[2]; }*tree_head; void init() { tree_head = new Tree(); n = strlen(s); memset(dp,false,sizeof dp); for(int i = n - 1; i >= 0; --i) { dp[i][i] = true; vis[i] = i; for(int j = i + 1; j < n; ++j) { if(s[i] == s[j]) { if(i + 2 >= j - 2) dp[i][j] = true; else dp[i][j] = dp[i + 2][j - 2]; } if(dp[i][j]) vis[i] = j; } } } void insert_tree(Tree *ptemp, char *s) { if(*s == '\0') return; if(r > vis[l]) return; int c = *s - 'a'; if(ptemp->next[c] == NULL) ptemp->next[c] = new Tree(); if(dp[l][r]) ptemp->next[c]->val++; r++; insert_tree(ptemp->next[c], s + 1); } void dfs(Tree *ptemp) { string temp = ans; if(k > 0 && ptemp->next[0]) { k -= ptemp->next[0]->val; ans = ans + 'a'; dfs(ptemp->next[0]); } if(k > 0 && ptemp->next[1]) { ans = temp; k -= ptemp->next[1]->val; ans = ans + 'b'; dfs(ptemp->next[1]); } } void solve() { scanf("%s %d",s,&k); init(); for(int i = 0; i < n; ++i) { l = r = i; insert_tree(tree_head,s + i); } dfs(tree_head); cout << ans << endl; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); solve(); return 0; }
相关文章推荐
- MWC-xxd新西达电机及电调标定
- 解决linux系统下因分区目录划分过小,导致tomcat使用系统临时文件夹(/tmp)没有足够空间而报错的问题
- js获取智能机浏览器版本信息
- makefile中的shell语法
- 中文标准web字体
- 2-d树
- dede 优化打开速度
- 数据库性能优化方法有哪些?
- 算法学习--队列初探
- Fresco自定义缓存的KEY以及判断自定义缓存是否成功
- 过河卒
- Object-c------foudation中的NSString
- MVVM
- 用模板实现堆
- leetcode 081 Search in Rotated Sorted Array II
- C# struct 与class 使用 new 关键字的区别
- 计算机中的几个实用技巧
- nyoj 239 月老的难题(匈牙利算法)
- delphi概念性学习(一)
- 51nod1459 迷宫游戏