51nod 1464 半回文(dp,Trie)
来源:互联网 发布:博达软件 编辑:程序博客网 时间:2024/06/11 23:58
参考题解:http://blog.csdn.net/haut_ykc/article/details/77933792
第一发是把所有半回文串放进了字典树,搜一发,半回文串是暴力找的,有两组数据超时。
看这个题解讲的挺好,用dp对半回文串预处理,dp[i][j]==true表示i开头的子串,以j结尾的子串是个半回文串,vis[i]表示以i开头的半回文串最远能够延伸到哪个位置。
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 6005;char s[MAXN];string ans;bool dp[MAXN][MAXN];int k,vis[MAXN];int siz,Trie[MAXN*1000][2];int num[MAXN*1000];void insert(int st){ int i, now = 0; for (i = st; i <= vis[st]; i++) { int v = s[i] - 'a'; if (Trie[now][v] == 0) Trie[now][v] = ++siz; if (dp[st][i]) num[Trie[now][v]]++; now = Trie[now][v]; }}void dfs(int x){ string tmp = ans; if (k > 0 && Trie[x][0]) { k -= num[Trie[x][0]]; ans = ans + 'a'; dfs(Trie[x][0]); } if (k > 0 && Trie[x][1]) { ans = tmp; k -= num[Trie[x][1]]; ans = ans + 'b'; dfs(Trie[x][1]); }}void init(int len){ for (int i = len-1; i >= 0; i--) { dp[i][i] = true; vis[i] = i; for (int j = i + 1; j < len; j++) { if (s[i] == s[j]) { if (i + 2 >= j - 2) dp[i][j] = 1; else dp[i][j] = dp[i + 2][j - 2]; } if (dp[i][j]) vis[i] = j; } }}int main(void){ scanf("%s", s); scanf("%d", &k); int len = strlen(s); init(len); for (int i = 0; i < len; i++) insert(i); dfs(0); cout << ans << endl; return 0;}
阅读全文
0 0
- 51nod 1464 半回文(dp,Trie)
- 51Nod-1464-半回文
- 51nod 1464 半回文
- 51nod 1154 回文串划分 (DP)
- 51nod 1092 回文字符串 dp问题
- 51nod 1092 回文字符串(区间dp)
- 51 NOD 1092 回文字符串(DP)
- 51nod 1503 猪和回文(dp)
- 【dp】51nod 1154 回文串划分
- 51nod 1092 回文字符串 【巧用 dp】
- 51nod 1503 猪和回文【DP】
- 51nod 1416半回文
- 51nod 1154回文串划分 dp+递推
- 51Nod 1092 回文字符串(LCS跟dp)
- 【51Nod】1154 - 回文串划分(dp)
- 51NOD 1154 回文串划分 【DP+Manacher】
- 51nod 1154 回文串划分(dp)
- 51nod 1092 回文字符串 LCS 或 区间dp
- 最短路径算法
- 半平面交,求解多边形内核
- TextView极细字体
- discuz 快速发帖链接
- 上机练习2 类与对象
- 51nod 1464 半回文(dp,Trie)
- 机器学习三(tensorflow 训练识别手写数字)
- 第一次写博客
- Win8.1无法安装msi软件提示2502、2503错误怎么解决?
- maven中端口占用报错
- js构造函数,原型对象,继承 (2)
- C#指定图片添加文字
- springboot-加载自定义的properties文件
- 主从复制、读写分离水平拆分及库表散列