您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ ACM 分块链表