HDU 4125 Moles 二叉排序树 树状数组 kmp
来源:互联网 发布:美国历史书籍推荐知乎 编辑:程序博客网 时间:2024/05/27 20:52
题目链接
题意
将一串数(
思路
这道题的每一块都十分清晰,建树,
然而问题就出在了数据量上。因此,要在两个方面进行优化。
这里有用到一个性质,那就是插入的节点的父亲,或者是大于它的最小值,或者是小于它的最大值,并且有且只有一个合法。
于是问题就转化成了树状数组求第
需要手写栈。
Code
#include <bits/stdc++.h>#define maxn 600010using namespace std;typedef long long LL;int id[maxn], ch[maxn][2], tot, a[maxn], f[7010], c[maxn], n, len, top, st[maxn];char s[maxn * 3], P[7010];bool vis[maxn];void getfail() { int m = strlen(P); f[0] = f[1] = 0; for (int i = 1; i < m; ++i) { int j = f[i]; while (j && P[j] != P[i]) j = f[j]; f[i+1] = P[i] == P[j] ? j+1 : 0; }}int kmp() { int j = 0, l = len, m = strlen(P), cnt = 0; for (int i = 0; i < l; ++i) { while (j && s[i] != P[j]) j = f[j]; if (s[i] == P[j]) ++j; if (j == m) ++cnt, j = f[j]; } return cnt;}int kas;void init() { memset(c, 0, sizeof(c)); memset(ch, 0, sizeof ch);}int lowbit(int x) { return x & -x; }void add(int x) { while (x <= n) ++c[x], x += lowbit(x); }int sum(int x) { int ret = 0; while (x) ret += c[x], x -= lowbit(x); return ret; }int query(int k) { int l = 1, r = n; while (r > l) { int mid = l + r >> 1; if (sum(mid) >= k) r = mid; else l = mid+1; } return l;}void insert(int x, int n) { add(x); int k = sum(x), l, r; if (k == 1) l = query(k+1), ch[l][0] = x; else if (k == n) r = query(k-1), ch[r][1] = x; else { l = query(k+1), r = query(k-1); if (!ch[r][1]) ch[r][1] = x; else ch[l][0] = x; }}void dfs(int u) { memset(vis, 0, sizeof(vis)); top = len = 0; st[top++] = u; while (top > 0) { int v = st[top-1]; s[len++] = v & 1 ? '1' : '0'; if (ch[v][0] && !vis[ch[v][0]]) { st[top++] = ch[v][0], vis[ch[v][0]] = true; continue; } if (ch[v][1] && !vis[ch[v][1]]) { st[top++] = ch[v][1], vis[ch[v][1]] = true; continue; } --top; }}void work() { init(); int x; scanf("%d", &n); scanf("%d", &x); add(x); int rt = x; for (int i = 2; i <= n; ++i) scanf("%d", &x), insert(x, i); dfs(rt); scanf("%s", P); getfail(); printf("Case #%d: %d\n", ++kas, kmp());}int main() { int T; scanf("%d", &T); while (T--) work(); return 0;}
阅读全文
0 0
- HDU 4125 Moles 二叉排序树 树状数组 kmp
- HDU 4125 Moles 树状数组 + KMP
- HDU 4125 Moles 笛卡尔树 + kmp
- 线段树+KMP-hdu-4125-Moles
- HDU 4125 Moles 线段树+KMP
- hdu 4125 树状数组+kmp
- hdu Moles(线段树&KMP)
- hdu 4125 Moles
- poj2299 Ultra-QuickSort 二叉排序树或树状数组
- HDU 1394 树状数组
- 树状数组 hdu
- hdu 1166 树状数组
- HDU 2838 树状数组
- hdu 2492【树状数组】
- hdu 3015【树状数组】
- hdu 3874 树状数组
- hdu 3874(树状数组)
- hdu 3890 树状数组
- QQ空间删除留言工具APP Android
- 【Java线程】锁机制:synchronized、Lock、Condition
- 20170921汇智和悦世界笔试题
- 计算机网络基础——什么是NAS
- 用maven创建多模块项目,分层开发
- HDU 4125 Moles 二叉排序树 树状数组 kmp
- 在libface的基础上使用人眼检测
- 数据库为什么需要锁机制?有哪些锁机制?
- 进程间通讯-共享内存
- ES6 Promise 小白入门有感
- Spark开发-Spark内核细说
- HOOK汇总
- kubernetes using OpenID Connect Tokens authentication
- 安卓进程间通信的四种方式(含案例)