2887 Big String
splay瞎搞一下,正解是分块数组或分块链表,但是学不会啊!
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
#include<set>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 2005
#define ull unsigned long long
#define ll long long
#define hashmod 99999839
#define mod 9997
int son[maxn][],fa[maxn],sz[maxn],root,len,q;
char s[maxn],v[maxn],ch;
//kpmsrzxxzu
inline void update(int o){
sz[o] = ;
if(son[o][] != -) sz[o] += sz[son[o][]];
if(son[o][] != -) sz[o] += sz[son[o][]];
}
inline int isrson(int p,int f){
if(f == -) return ;
return son[f][] == p;
}
inline void changeson(int p,int f,int v){
if(f != -) son[f][v] = p;
if(p != -) fa[p] = f;
if(f == -) root = p;
}
int build(int l,int r){
if(l > r) return -;
int o = len;
len++;
if(l == r){son[o][] = son[o][] = -,sz[o] = ,v[o] = s[l];return o;}
int mid = (l + r) >> ,ls,rs;
v[o] = s[mid],ls = build(l,mid-),rs = build(mid+,r);
changeson(ls,o,),changeson(rs,o,),update(o);
return o;
}
void rotate(int p){//只会出现祖辈不存在的情况
int f = fa[p],g = fa[f];
int u = isrson(p,f),v = isrson(f,g);
changeson(son[p][u^],f,u),changeson(f,p,u^),changeson(p,g,v);
update(f);
}
void splay(int p,int tar){
if(fa[p] == tar) return;
while(fa[p] != tar && fa[fa[p]] != tar){
int f = fa[p],g = fa[f];//保证了父亲及其祖先存在
int u = isrson(p,f),v = isrson(f,g);
if(u ^ v) rotate(p),rotate(p);
else rotate(f),rotate(p);
}
if(fa[p] != tar) rotate(p);
update(p);
}
int findtr(){
int p = root,ls = son[p][],rs = son[p][];
if(q >= sz[p]) q = sz[p] - ;
while(){
if(ls == -){
if(q == ) break;
else p = rs,q--;
ls = son[p][],rs = son[p][];
continue;
}
if(sz[ls] >= q) p = ls;
else if(sz[ls] + == q) break;
else p = rs,q = q - sz[ls] - ;
ls = son[p][],rs = son[p][];
}
return p;
}
void insert(){
int p = findtr();
splay(p,-);
int o = len;
len++,v[o] = ch;
changeson(root,o,),changeson(son[root][],o,);
son[root][] = -,fa[o] = -;
update(root);
root = o;
update(root);
}
void query(){
int p = findtr();
printf("%c\n",v[p]);
splay(p,-);
}
signed main(){
// freopen("a.in","r",stdin);
// freopen("b.out","w",stdout);
// int k = 0;
while(~scanf("%s",s + )){
int t = strlen(s + );
len = ;
s[] = '\0',s[t + ] = '\0';
root = build(,t + );
fa[root] = -;
int n;
char op[];
scanf("%d",&n);
// printf("Case %d:\n",++k);
for(register int i = ;i <= n;++i){
scanf("%s",op);
if(op[] == 'Q') scanf("%d",&q),q++,query();
else scanf("%s%d",op,&q),ch = op[],insert();
}
}
return ;
}
2887 Big String的更多相关文章
- POJ 2887 Big String(块状链表)
题目大意 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 做法分析 好多不同的做法都可以 ...
- poj 2887 Big String
题目连接 http://poj.org/problem?id=2887 Big String Description You are given a string and supposed to do ...
- Poj 2887 Big String(块状数组)
Big String Time Limit: 1000MS Memory Limit: 131072K Description You are given a string and supposed ...
- POJ 2887 Big String (块状数组)
题意:给一个字符串(<=1000000)和n个操作(<2000),每个操作可以在某个位置插入一个字符,或者查询该位置的字符.问查询结果. 思路:块状数组. 如果将原来的字符串都存在一起,每 ...
- Poj 2887-Big String Splay
题目:http://poj.org/problem?id=2887 Big String Time Limit: 1000MS Memory Limit: 131072K Total ...
- POJ 2887:Big String(分块)
http://poj.org/problem?id=2887 题意:给出一个字符串,还有n个询问,第一种询问是给出一个位置p和字符c,要在位置p的前面插入c(如果p超过字符串长度,自动插在最后),第二 ...
- Big String(poj 2887)
题意: 给你一个不超过1e6的字符串,和不超过2000次的操作 操作分为两种: 1.将一个字符插入到某个位置的前面 2.询问当前位置的字符 /* 块状链表模板水题(我的智商也就能做这种题了). 观察题 ...
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
随机推荐
- vue同胞组件通讯解决方案(以下为一种另外可用vuex解决)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ftp 报错 200 Type set to A
最近在使用ssis 从ftp服务器抓起文件到本地的时候,发现连接ftp出错 200 Type set to A 解决办法: ftp connection 中 设置UsePassiveMode 为Tru ...
- 管道命令和xargs的区别(经典解释) 自己的总结
1. 简介 之所以能用到这个命令,关键是由于很多命令不支 持|管道来传递参数,而日常工作中有有这个必要, 所以就有了xargs命令,例如:find /sbin -perm +700 |ls -l 这个 ...
- echo - 显示一行文本
SYNOPSIS(总览) echo[OPTION]... [STRING]... DESCRIPTION(描述) 允许在标准输出上显示STRING(s). -n 不输出行尾的换行符. -e 允许对下面 ...
- 使用阿里云RDS
1)购买 注意内网免费 外网收费 内网需要跟服务器ECS在同一VPC下 即ECS买在华东1 RDS也必须在华东1 2)使用 配置白名单 全部通过设置为0.0.0.0/0 (不建议) 创建账户 创建数 ...
- 错误的语法:"create view必须是批处理中仅有的语句"
编写脚本提示: 错误的语法:"create view必须是批处理中仅有的语句" FROM sys.views WHERE name = 'v_CS_UserRoleNames' ) ...
- luogu P2241 统计方形
题目背景 1997年普及组第一题 题目描述 有一个n*m方格的棋盘,求其方格包含多少正方形.长方形 输入输出格式 输入格式: n,m因为原来数据太弱,现规定m小于等于5000,n小于等于5000(原来 ...
- C#对象初始化的探讨
最近在弄MQ的性能监测数据埋点,无疑中用到一个Nstatsd的客户端,看到里面写过里面一种嵌套类的写法.代码如下: 客户端Client是一个密封的类,并且构造函数私有访问.然后又用一个嵌套类Curre ...
- 解决SimpleDateFormat线程安全问题
package com.tanlu.user.util; import java.text.DateFormat; import java.text.ParseException; import ja ...
- 条款36:绝不重新定义继承而来的non-virtual函数(Never redefine an inherited non-virtual function)
NOTE: 1.绝对不要重新定义继承而来的non-virtual函数.