Codeforces 557E Ann and Half-Palindrome DP+字典树
来源:互联网 发布:starfm融合算法 编辑:程序博客网 时间:2024/05/01 20:40
求字典序第K大的半回文串,半回文串满足第一位和最后一位相等,第三位和倒数第三位相等。。。。先用dp求出所有的半回文串,然后插入到字典树中统计个数,根据个数求第K大。
#include #include char s[5010];int k;int dp[5010][5010];int ch[5010*5010/2][2];int sum[5010*5010/2];int val[5010*5010/2];int sz;void init() { sz = 1;}void dfs(int u, int x, int n, int pos) { if(n == x) { return; } int c = s[x]-'a'; if(ch[u][c] == 0) { ch[u][c] = sz++; } int v = ch[u][c]; dfs(v, x+1, n, pos); if(dp[pos][x] == 1) { val[v] += 1; } sum[v] = sum[ch[v][0]] + sum[ch[v][1]] + val[v];}void insert(int pos) { int u = 0, n = strlen(s); dfs(u, pos, n, pos);}void find(int k) { char ans[5010]; int t = 0; int u = 0; while(k > 0) { int c = ch[u][0]; //System.out.println(sum[u] + " " + sum[ch[u][0]] + " " + sum[ch[u][1]] + " " + k); int num = sum[u]-(sum[ch[u][0]]+sum[ch[u][1]]); if(u == 0) num = 0; if(k <= num) break; k -= num; if(sum[c] >= k) { u = c; ans[t++] = 'a'; } else { k -= sum[c]; u = ch[u][1]; ans[t++] = 'b'; } } ans[t] = 0; printf("%s", ans);}void dfs2(int u) { if(u == 0) return; dfs2(ch[u][0]); dfs2(ch[u][1]); sum[u] += sum[ch[u][0]] + sum[ch[u][1]];}int main() { scanf("%s %d", s, &k); int len = strlen(s); for(int i = 0; i < len; i++) { dp[i][i] = 1; } for(int i = 0 ; i+1 < len; i++) { if(s[i] == s[i+1]) dp[i][i+1] = 1; } for(int i = 0 ; i+2 < len; i++) { if(s[i] == s[i+2]) dp[i][i+2] = 1; } for(int i = 0 ; i+3 < len; i++) { if(s[i] == s[i+3]) dp[i][i+3] = 1; } for(int i = 5; i <= len; i++) { for(int j = 0; j+i <= len; j++) { if(s[j] == s[j+i-1] && dp[j+2][j+i-3] == 1) { dp[j][j+i-1] = 1; } } } init(); for(int i = 0; i < len; i++) { insert(i); } //dfs2(ch[0][0]); //dfs2(ch[0][1]); find(k);}
0 0
- Codeforces 557E Ann and Half-Palindrome DP+字典树
- [字典树] Codeforces 557E Ann and Half-Palindrome
- [字典树] Codeforces 557E Ann and Half-Palindrome
- Codeforces 557E - Ann and Half-Palindrome (字典树+DP)
- Codeforces 577E Ann and Half-Palindrome 字典树
- cf #311 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(字典树+dp)
- codeforces 557 E Ann and Half-Palindrome
- 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 Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树
- [Codeforces 557E] Ann and Half-Palindrome (Trie树+子串排序)
- Codeforces 311(div 2):E. Ann and Half-Palindrome
- 找出s的子串中字典序第k小的“半回文串” Trie Codeforce Div. 2 Ann and Half-Palindrome
- Codeforces 557E dp+字典树+字典序第k大
- [codeforces] 501E - Misha and Palindrome Degree
- 通过Button按钮调节亮度
- 欢迎使用CSDN-markdown编辑器
- Android 使用ZXing扫描在部分手机上扫描变形解决办法
- IE兼容css效果-滤镜实现
- Django model字段类型清单
- Codeforces 557E Ann and Half-Palindrome DP+字典树
- 字典树模版
- 最近公共祖先模版
- mysql压缩版安装 修改默认字符集
- ORA-01000: 超出打开游标的最大数(解决及原因)
- 学而时习之
- Android 将View 转化为bitmap 图片
- Android事件分发
- mysql索引