Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树
来源:互联网 发布:matlab2016 mac破解版 编辑:程序博客网 时间:2024/05/01 16:53
E. Ann and Half-Palindrome
time limit per test1.5 seconds
memory limit per test512 megabytes
inputstandard input
outputstandard output
Tomorrow Ann takes the hardest exam of programming where she should get an excellent mark.
On the last theoretical class the teacher introduced the notion of a half-palindrome.
String t is a half-palindrome, if for all the odd positions i () the following condition is held: ti = t|t| - i + 1, where |t| is the length of string t if positions are indexed from 1. For example, strings “abaa”, “a”, “bb”, “abbbaa” are half-palindromes and strings “ab”, “bba” and “aaabaa” are not.
Ann knows that on the exam she will get string s, consisting only of letters a and b, and number k. To get an excellent mark she has to find the k-th in the lexicographical order string among all substrings of s that are half-palyndromes. Note that each substring in this order is considered as many times as many times it occurs in s.
The teachers guarantees that the given number k doesn’t exceed the number of substrings of the given string that are half-palindromes.
Can you cope with this problem?
Input
The first line of the input contains string s (1 ≤ |s| ≤ 5000), consisting only of characters ‘a’ and ‘b’, where |s| is the length of string s.
The second line contains a positive integer k — the lexicographical number of the requested string among all the half-palindrome substrings of the given string s. The strings are numbered starting from one.
It is guaranteed that number k doesn’t exceed the number of substrings of the given string that are half-palindromes.
Output
Print a substring of the given string that is the k-th in the lexicographical order of all substrings of the given string that are half-palindromes.
Sample test(s)
input
abbabaab
7
output
abaa
input
aaaaa
10
output
aaa
input
bbaabb
13
output
bbaabb
Note
By definition, string a = a1a2… an is lexicographically less than string b = b1b2… bm, if either a is a prefix of b and doesn’t coincide with b, or there exists such i, that a1 = b1, a2 = b2, … ai - 1 = bi - 1, ai < bi.
In the first sample half-palindrome substrings are the following strings — a, a, a, a, aa, aba, abaa, abba, abbabaa, b, b, b, b, baab, bab, bb, bbab, bbabaab (the list is given in the lexicographical order).
题意要输出奇回文子串的第k个字典序的串,奇回文串,就是只要求奇数位置满足回文串的要求就可以了!
这用dp推下就可以了,dp[i][j]表从i到j是否是回文串
则dp[i][j] = dp[i+2][j-2](j-i>=4),其他的都是奇回文串;
要输出第k个字典序的子串,首先肯定想到要用字典树输出来就是了,很简单的dfs就可以了。插入串的时候,就不要一个一个插了,而直接插一个后缀就可以了这样总的复杂度也就是O(n * n),n是串的长度。
#define N 5050#define M 100005#define maxn 205#define maxnode 20000050#define sigma_size 2#define MOD 1000000000000000007int n,len,ansi,sum;bool dp[N][N];char str[N],ans[N];struct Trie{ int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void Init(){sz = 1;val[0]=0;memset(ch[0],0,sizeof(ch[0]));} Trie(){} int idx(char c){ return c - 'a';} void insert(char * s,int l,int r){ int u = 0; for(int i=l;i<=r;i++){ int c = idx(s[i]); if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz ++; } u = ch[u][c]; if(dp[l][i])val[u]++; } } bool find(int root,int k){ sum = sum + val[root]; if(sum >= k) { ansi = 0; return true; } FI(sigma_size){ if(ch[root][i]){ int u = ch[root][i]; if(find(u,k)){ ans[ansi++] = i; return true; } } } return false; }};Trie T;int main(){ while(SS(str)!=EOF) { T.Init(); S(n); len = strlen(str); FI(len) dp[i][i] = true; for(int l = 1;l<len;l++) for(int i=0;i + l<len;i++){ int j = i+l; if(str[j] != str[i]) dp[i][j] = false; else if(j - i <= 3) dp[i][j] = true; else dp[i][j] = dp[i+2][j-2]; } FI(len){ T.insert(str,i,len-1); } sum = 0; T.find(0,n); for(int i=ansi - 1;i>=0;i--){ printf("%c",ans[i] + 'a'); } printf("\n"); } return 0;}
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome (DP+字典树)
- Codeforces Round #311 (Div. 2) E - Ann and Half-Palindrome(字典树+dp)
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树
- Codeforces 311(div 2):E. Ann and Half-Palindrome
- Codeforces 577E Ann and Half-Palindrome 字典树
- [字典树] Codeforces 557E Ann and Half-Palindrome
- Codeforces 557E Ann and Half-Palindrome DP+字典树
- [字典树] Codeforces 557E Ann and Half-Palindrome
- cf #311 E. Ann and Half-Palindrome (dp+字典树)
- codeforces 557 E Ann and Half-Palindrome
- Codeforces 557E - Ann and Half-Palindrome (字典树+DP)
- Codeforces 557E Ann and Half-Palindrome (字典树+字符串排序)
- Codeforces 557E Ann and Half-Palindrome (Trie树)
- codeforces #311 557E E. Ann and Half-Palindrome(trie+dp+dfs)
- [Codeforces 557E] Ann and Half-Palindrome (Trie树+子串排序)
- 找出s的子串中字典序第k小的“半回文串” Trie Codeforce Div. 2 Ann and Half-Palindrome
- Codeforces Round #442 (Div. 2) F. Ann and Books
- Codeforces Round #285 (Div. 2) E. Misha and Palindrome Degree 二分+容斥
- win7系统激活状态不可用
- [C++]GCC的C++入门(2012-10-28更新)
- OpenGL蓝宝书第五章代码勘误以及惯性坐标系去解释模型变换:Pyramid.cpp
- 集成开发环境(IDE)学习笔记系列
- 在Android项目中导入的很普通的包都无法解析(把android版本选上)
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树
- MySQL Cluster 核心概念
- thymeleaf 解析html时,出现 SAXParseException: The content of elements must consist of well-formed characte
- Python pypinyin、jieba模块
- 慕课网python基础学习教案(变量和数据类型)
- Java正则表达式 matchs split replaceAll实例
- yield关键字跟递归结合使用
- ExtJs引入js和Easyui引入js
- 安装androidstudio时报错the following sdk component was not installed:build-boots21.1.1