POJ 2887 分块链表 , vector 实现
2014-08-10 13:22
211 查看
两个操作 , 插入一个字符到第p 个位置前面跟 查询第p个位置是什么字符。。
//tpl
//ipqhjjybj_tpl.h
//header.h
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <math.h>
#define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define pb(x) push_back(x)
#define rep(i,j,k) for(int i = j; i < k;i++)
#define MAX(x,a) x=((x)<(a))?(a):(x);
#define MIN(x,a) x=((x)>(a))?(a):(x);
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1111111;
vector<char> vec[2500];
int n,m;
int q;
char s
;
char ts[10];
void insert(char c,int l){
int sz = 0,i;
for(i=0; ; i++){
if(sz + vec[i].size() >= l)
break;
else sz += vec[i].size();
// printf("ss fuck i=%d\n",i);
}
vec[i].insert(vec[i].begin()+l-sz,c);
}
char get(int l){
int sz = 0 , i ;
for(i = 0; ;i++){
if(sz + vec[i].size() > l)
break;
else sz+=vec[i].size();
// printf("fuck i=%d\n" ,i );
}
return vec[i][l-sz];
}
int main(){
scanf("%s",s);
scanf("%d",&q);
m = 1100;
rep(i,0,m+3)
vec[i].reserve(m+5);
for(int i = 0;s[i];i++){
vec[i/m].pb(s[i]);
}
while(q--){
int l;
scanf("%s",ts);
if(ts[0] == 'Q'){
scanf("%d",&l);
l--;
printf("%c\n",get(l));
}else{
scanf("%s %d",ts,&l);
l--;
insert(ts[0],l);
}
}
return 0;
}
//tpl
//ipqhjjybj_tpl.h
//header.h
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <math.h>
#define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define pb(x) push_back(x)
#define rep(i,j,k) for(int i = j; i < k;i++)
#define MAX(x,a) x=((x)<(a))?(a):(x);
#define MIN(x,a) x=((x)>(a))?(a):(x);
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1111111;
vector<char> vec[2500];
int n,m;
int q;
char s
;
char ts[10];
void insert(char c,int l){
int sz = 0,i;
for(i=0; ; i++){
if(sz + vec[i].size() >= l)
break;
else sz += vec[i].size();
// printf("ss fuck i=%d\n",i);
}
vec[i].insert(vec[i].begin()+l-sz,c);
}
char get(int l){
int sz = 0 , i ;
for(i = 0; ;i++){
if(sz + vec[i].size() > l)
break;
else sz+=vec[i].size();
// printf("fuck i=%d\n" ,i );
}
return vec[i][l-sz];
}
int main(){
scanf("%s",s);
scanf("%d",&q);
m = 1100;
rep(i,0,m+3)
vec[i].reserve(m+5);
for(int i = 0;s[i];i++){
vec[i/m].pb(s[i]);
}
while(q--){
int l;
scanf("%s",ts);
if(ts[0] == 'Q'){
scanf("%d",&l);
l--;
printf("%c\n",get(l));
}else{
scanf("%s %d",ts,&l);
l--;
insert(ts[0],l);
}
}
return 0;
}
相关文章推荐
- POJ 2887 Big String(块状链表)
- [POJ 2887] Big String [块状链表]
- poj 2524(并查集 链表实现)
- POJ-2887(块状链表)
- poj 3264 线段树,链表实现
- poj 2887 Big String 块状链表
- 九度 OJ 1447 题 最短路径问题 Dijkstra(迪杰斯特拉)算法实现,使用vector模板模拟邻接链表
- POJ 2887 Big String(块状链表)
- poj 2887 Big String(块状链表)
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- Dijkstra的实现(用vector模拟邻接链表)
- poj 2887 块状链表 单点插入+单点查询
- poj 1469 COURSES(二分匹配 vector 邻接表 实现)
- 用链表实现vector
- 链表的C语言实现之动态内存分配(转载)
- 链表的C语言实现(七)
- 链表的c语言实现(四)
- 使用JAVA实现双向链表
- 链表的C语言实现之动态内存分配
- c实现的一个经典链表