意甲冠军:

特定n,

下面是一个1-n该装置。

下面的二进制字符串。

按给定的建立二叉树安排。

然后遍历树(根->左子树->根->右子树->根)

当遍历节点 如果右值为奇数入栈一个1,若为偶数入栈一个0

得到一个母串。

问母串中出现了几次子串。

思路:

先是建树得到母串。然后求子串个数就是裸的KMP。

建树就是找个规律,然后用线段树维护一下输入的排列

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
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');
}
//
const int N = 600000+5;
const int M = 70000+5;
int mi[N<<2], pos[N];
inline void up(int& fa, int& ls, int& rs) {if (ls>rs)fa = rs;elsefa = ls;
}
void build(int l, int r, int rt) {if (l == r) {mi[rt] = pos[l];} else {int mid = (l+r)>>1;build(lson);build(rson);up(mi[rt], mi[rt<<1], mi[rt<<1|1]);}
}
int query(int L, int R, int l, int r, int rt) {if (L<= l && r<=R) {return mi[rt];} else {int mid = (l+r)>>1;if (L>mid)return query(L, R, rson);else if (R<=mid)return query(L, R, lson);elsereturn min(query(L, mid, lson), query(mid+1, R, rson));}
}
void update(int p, int v, int l, int r, int rt) {if (l == r) {mi[rt] = v;} else {int mid = (l+r)>>1;if (p <= mid)update(p, v, lson);elseupdate(p, v, rson);up(mi[rt], mi[rt<<1], mi[rt<<1|1]);}
}int T = 0, n, a[N], L[N], R[N];
char s[M], ch[N*3];
int nex[M], top;
void dfs(int u, int l, int r) {update(u, n+1, 1, n, 1);int v = query(l, u, 1, n, 1);if (v != n+1) {L[u] = a[v];dfs(a[v], l, u);}v = query(u, r, 1, n, 1);if (v != n+1) {R[u] = a[v];dfs(a[v], u, r);}
}
void f(int u) {char c;if (u&1)c = '1';elsec = '0';ch[top++] = c;if (L[u] != -1) {f(L[u]);ch[top++] = c;}if (R[u] != -1) {f(R[u]);ch[top++] = c;}
}
void work() {int v, len, idx, ans = 0;rd(n);for (int i = 1; i <= n; ++i) {rd(a[i]);pos[a[i]] = i;}build(1, n, 1);memset(L, -1, sizeof L);memset(R, -1, sizeof R);dfs(a[1], 1, n);//scanf("%s", s);len = strlen(s);nex[0] = nex[1] = 0;for (int i = 1; i < len; ++i) {int j = nex[i];while (j && s[j] != s[i])j = nex[j];if (s[i] == s[j])nex[i+1] = j+1;elsenex[i+1] = 0;}//top = 0;f(a[1]);idx = 0;for (int i = 0; i < top; ++i) {while (idx && s[idx] != ch[i])idx = nex[idx];if (s[idx] == ch[i])++ idx;if (idx == len) {++ ans;idx = nex[idx];}}printf("Case #%d: %d\n", ++T, ans);
}
int main() {int cas;scanf("%d", &cas);while (cas-->0)work();return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU 4125 Moles 段树+KMP相关推荐

  1. HDU 4125 Moles 线段树+KMP

    题意: 给定n, 下面是1-n的排列. 下面一个二进制子串. 先按给定的排列建出二叉树. 然后遍历树(根->左子树->根->右子树->根) 遍历这个节点时 若权值为奇数入栈一个 ...

  2. HDU 4125 Moles 二叉排序树 树状数组 kmp

    题目链接 题意 将一串数( n≤1e6 n\leq 1e6)依次插入到一棵二叉排序树中, dfs dfs一遍,将经过的每个节点的信息加到一个串尾(如果当前节点为奇数则加 ′1′ '1'否则加 ′0′ ...

  3. hdu 4125 Moles(kmp+树状数组)

    题目链接:hdu 4125 Moles 题意: 给你n个数,让你按键值建一个平衡二叉树,然后奇数为0,偶数为1,然后可以遍历这颗树得到一个欧拉序列,现在给你一个串,问你出现了几次. 题解: 建树的时候 ...

  4. HDU 4125 Moles 笛卡尔树 + kmp

    题意:有n(1<=n<=600000)个鼹鼠挖洞,每个鼹鼠有给定权值,挖的洞是一颗二叉树(左边的鼹鼠权值都比当前鼹鼠小,右边的鼹鼠权值比当前鼹鼠大), 也要按照鼹鼠的出场顺序挖洞,在形成的 ...

  5. HDU 4125 Moles 树状数组 + KMP

    这题的重点就在于建树, 题目读懂以后, 就会发现, 树建好以后就是一颗排序二叉树. 于是每次用树状数组二分找该节点的插入点. 树建完以后DFS得到字符串, 由于节点非常多, 于是要手写栈. 字符串得到 ...

  6. hdu 4125 Moles

    这几天在做北大出的现场赛题,崩溃. 今天做的11年福州的现场赛题,俩字,呵呵... 好几道都是各种算法糅合啊啊啊啊... 哎 这个题,比较恶心了,DFS不能用系统栈,得自己写,好吧.不算神马.建二叉查 ...

  7. HDU 4417-Super Mario-线段树+离线

    Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...

  8. HDU 4267-Phage War-线段树

    http://acm.hust.edu.cn/vjudge/problem/31829/origin 题意:n个数 q次操作 每次操作 1: 区间更新[a,b,k,c]  对区间[a,b]从a开始每k ...

  9. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)...

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

最新文章

  1. document.onclick在ios上不触发的解决方法与touchstart点击穿透处理
  2. iMeta期刊12名编委入选科睿唯安2021年度高被引学者
  3. python手机版打了代码运行不了-android手机安装python并写代码运行
  4. wide_and_deep 思维导图和代码
  5. 实战并发编程 - 06线程在执行过程中的状态是如何流转的
  6. c malloc 头文件_C语言提高篇_malloc,realloc和calloc的区别
  7. 计算机网络class 3(速率的相关性能指标)
  8. 图片流_干货来袭!web前端开发工程师必看之如何使用CSS3实现瀑布流效果?
  9. 异步Udp监听关闭 出现异常,访问已释放的资源或者其他错误的解决方法
  10. 物联网发展 制定技术标准才能更好监管
  11. android 开机动画制作
  12. 五、文章详情页制作及跳转功能实现《iVX低代码/无代码个人博客制作》
  13. 关于调用360极速浏览器 2345浏览器的方法
  14. npm安装依赖包报ERR问题汇总及处理
  15. MIPI屏上电时序问题
  16. 重走c语言—摸鱼大学生的c语言基础笔记
  17. 编程中取名,有什么需要注意?
  18. ★思维导图的30个问答
  19. 编写configure.ac
  20. python编程midi键盘按键_python 偷懒技巧——使用 keyboard 录制键盘事件

热门文章

  1. 蓝牙搜索显示结果到ListView(十分精简)
  2. C语言刷题随记 —— 国际象棋棋盘
  3. 【热门】现在的美颜特效有多可怕?基于Opencv的美颜相机告诉你
  4. LAN8720A芯片
  5. Oracle计算两个日期的月份
  6. 029:vue+openlayers:使用MVT格式读取瓦片数据(示例代码)
  7. 以结算价交易TAS和以市价交易TAM
  8. 企业信用代码等常用的正则验证
  9. Java——Web开发之MVC设计模式的学生信息管理系统(二)
  10. 7-6 打妖怪 (10 分)