Codeforces 577E Ann and Half-Palindrome 字典树
来源:互联网 发布:广联达软件配置要求 编辑:程序博客网 时间:2024/05/01 10:59
题目链接
题意:
若一个字符串是半回文串,则满足第一位和最后一位相等, 第三位和倒数第三位相等,如此类推。
给定一个字符串s,输出s的所有子串中的半回文串字典序第k大的 字符串。
good[i][j] 表示 s(i,j) 是半回文串。
把这些回文串插到字典树里 在字典树上找第k个叶子节点。
插入时:插入以i点开头的所有半回文串。
#include <iostream>#include <string>#include <vector>#include <cstring>#include <cstdio>#include <map>#include <queue>#include <algorithm>#include <stack>#include <cstring>#include <cmath>#include <set>#include <vector>using namespace std;template <class T>inline bool rd(T &ret) {char c; int sgn;if (c = getchar(), c == EOF) return 0;while (c != '-' && (c<'0' || c>'9')) c = getchar();sgn = (c == '-') ? -1 : 1;ret = (c == '-') ? 0 : (c - '0');while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');ret *= sgn;return 1;}template <class T>inline void pt(T x) {if (x < 0) {putchar('-');x = -x;}if (x > 9) pt(x / 10);putchar(x % 10 + '0');}typedef int ll;typedef pair<int, int> pii;const int inf = 1e9;const int N = 5005;bool good[N][N];#define Word_Len 5050000 #define Sigma_size 2 struct <span class="KSFIND_CLASS_SELECT" id="0KSFindDIV">Trie</span> {ll ch[Word_Len][Sigma_size], sz; //Word_Len是字典树的节点数 若都是小写字母Sigma_size=26 sz为当前节点数 ll Have_word[Word_Len]; //这个节点下有几个单词 ll val[Word_Len]; // 这个节点附带的信息,初始化为0表示这个节点不存在单词,所以节点带的信息必须!=0 ll pre[Word_Len];char he[Word_Len];ll Newnode() { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = Have_word[sz] = 0; return sz++; }void init() //初始化字典树 {sz = 0; Newnode();}//初始化 ll idx(char c) { return c - 'a'; } //字符串编号 int insert(char *s, int start) { //把v数字加给 s单词最后一个字母 ll u = 0;for (ll i = 0; s[i]; i++) {ll c = idx(s[i]);if (!ch[u][c]) //节点不存在就新建后附加 {ch[u][c] = Newnode();he[sz - 1] = s[i];pre[sz - 1] = u;}u = ch[u][c];if (good[start][start + i]) Have_word[u]++;}return u;}void dfs(int u) {val[u] += Have_word[u];for (int i = 0; i < Sigma_size; i++){int v = ch[u][i];if (!v)continue;dfs(v);val[u] += val[v];}}int find_kth(int u, int k) {if (u)putchar(he[u]);if (k <= Have_word[u])return u;k -= Have_word[u];for (int i = 0; i < Sigma_size; i++){int v = ch[u][i];if (!v)continue;if (k <= val[v]){return find_kth(v, k);}else k -= val[v];}}} ac;int n, k;char s[N];int main() {scanf("%s", s);rd(k);n = strlen(s);for (int i = 0; i < n; i++){for (int l = i, r = i; l >= 0 && r < n; l --, r ++) {if (s[l] == s[r])if (l + 2 >= r - 2 || r - 2 < 0 || l + 2 >= n || good[l + 2][r - 2])good[l][r] = true;}for (int l = i, r = i + 1; l >= 0 && r < n; l --, r ++){if (s[l] == s[r])if (l + 2 >= r - 2 || r - 2 < 0 || l + 2 >= n || good[l + 2][r - 2])good[l][r] = true;}}ac.init();for (int i = 0; i < n; i++){int j = n - 1;while (good[i][j] == false)j--;char c = s[j + 1]; s[j + 1] = 0;ac.insert(s + i, i);s[j + 1] = c;}ac.dfs(0);ac.val[0] = 0;ac.find_kth(0, k);return 0;}
ti
tri
Trie
0 0
- 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 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 557E - Ann and Half-Palindrome (字典树+DP)
- Codeforces 557E Ann and Half-Palindrome (字典树+字符串排序)
- Codeforces 557E Ann and Half-Palindrome (Trie树)
- Codeforces 311(div 2):E. Ann and Half-Palindrome
- [Codeforces 557E] Ann and Half-Palindrome (Trie树+子串排序)
- codeforces #311 557E E. Ann and Half-Palindrome(trie+dp+dfs)
- 找出s的子串中字典序第k小的“半回文串” Trie Codeforce Div. 2 Ann and Half-Palindrome
- [codeforces] 501E - Misha and Palindrome Degree
- codeforces 665E (字典树)
- 获得二叉树中两个节点的所有公共祖先
- synergy使用配置<Server window7 Client Fedora21>
- [Objective-C]-02-set get语法.类方法.self关键字与点语法
- HDU 1086You can Solve a Geometry Problem too(判断线段相交模板题)
- HTTP协议详解
- Codeforces 577E Ann and Half-Palindrome 字典树
- 算法导论 第十四章:区间树
- instanceof和getClass()的区别
- 有效检查Java代码的工具:5款调试工具
- 劳累的一天啊
- jdbc与mybatis及spring
- 极光推送使用后初总结
- C语言编程基础7.8
- LeetCode---(50)Pow(x, n)