题意:

给定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 2795 Billboard (线段树+贪心)

    HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...

  5. HDU_4125 Moles 线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=4125 题意: 给你N个数字,先按照给数的顺序建一棵二叉查找树,然后按中序遍历树的结点,并记录访问结点的奇偶顺序, ...

  6. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  7. hdu 3308 LCIS 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...

  8. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  9. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

最新文章

  1. Django博客系统(用户中心展示)
  2. python3网络编程实战
  3. 以太网与802.3,wifi与802.11的关系
  4. 供应链金融服务平台:应收、预付和存货融资业务
  5. send函数 获得已发送数据长度_蓝牙BLE开发1--起因与回调函数
  6. 团队行为心理学读书笔记(3)领导力背后的行为心理学
  7. 【转】TCP协议的无消息边界问题
  8. 基于智能卡的嵌入式网络加密安全系统设计
  9. (29)Gulp组合任务
  10. 监听是否到达页面滑动的可视区域最底部
  11. Google工程师多图详解Android架构
  12. 【学习资料】Gradle Android重要的学习资料
  13. 第二章 IOC的配置使用 --《跟我学Spring》笔记 张开涛
  14. 51单片机入门——DS18B20
  15. 数据库之系统的三级模式结构
  16. 《数据安全法》施行在即,政企单位如何构建数据安全治理体系?
  17. word中的方括号怎么删_Word如何批量删除习题括号内答案
  18. linux shell 10进制转16进制
  19. 树莓派+USB摄像头+Yeelink--5分钟内DIY你自己的家庭监控
  20. SOLIDWORKS Electrical端子排管理

热门文章

  1. XYOj2113:找点(区间选点问题)
  2. TFN全新推出的全功能 手持式频谱分析仪 RMT系列 不仅可干扰定位 还可路测
  3. 企业微信如何快速高效添加好友?
  4. 简述神经网络学习过程
  5. 亮剑java web_为什么《亮剑Java Web 项目开发案例导航》第二个项目运行不了?
  6. Vue2学习笔记1 - win10下安装vue开发环境
  7. delphi xe “[FIREDAC][PHYS][SQLITE] DATABASE IS LOCKED”错误
  8. android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
  9. Java第十五篇:详解一元二次方程
  10. 个税计算--Java