#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
using namespace std;
typedef unsigned long long ULL;
int maxn,n; //总共有maxn块,n个命令。
int sum[1005]; //前i块的总长度,前缀和
struct BlockList
{
int size; //块长
char dat[2005]; //块内字符串。
void push_back(char c) //将字符c插入dat的串尾
{
dat[++size]=c;
}
void insert(int pos,char c) //将字符串插入块内字符串dat中第pos个位置.
{
for(int i=++size;i>pos;i--)
dat[i]=dat[i-1];
dat[pos]=c;
}
char at(int pos) //返回dat中第pos个字符
{
return dat[pos];
}
}block[1005];
void insert(int s,int p,char c) //将字符串c插入s块的第p个位置前。
{
p=min(p,block[s].size+1); //计算插入位置p(不大于s块的串长+1)
block[s].insert(p,c); //插入字符c
}
char quary(int s,int p) //返回s块中的第p个字符。
{
return block[s].at(p);
}
void maintain() //计算前i块的总长度。
{
for(int i=1;i<=maxn;i++)
sum[i]=sum[i-1]+block[i].size;
}
int myquary(int pos) //返回当前串中第pos个字母。
{
int p=lower_bound(sum+1,sum+1+maxn,pos)-sum; //查找pos所在的块序号。
return quary(p,pos-sum[p-1]); //返回p块位置为pos-sum[p-1]的字符。
}
void myinsert(int pos,char c) //将字符串插入到当前串的pos位置前。
{
int p=lower_bound(sum+1,sum+1+maxn,pos)-sum; //计算pos位置所在的块序号p
insert(p,pos-sum[p-1],c); //将字母c插入p块的第pos-sum[p-1]位置前。
maintain(); //调整前缀长度数组。
}
char str[1000005];
void init() //初始串
{
int len=strlen(str)+n;
maxn=(int)sqrt(len*1.0)+1; //计算块数maxn=sqrt(串长+指令数)
for(int i=0;str[i];i++) //依次将初始串中的每个字母送去块中
block[i/maxn+1].push_back(str[i]);
maintain();
}
int main()
{
ios::sync_with_stdio(false); //
cin.tie(0); //加速输入输出
gets(str);
int pos;
char p,s;
cin>>n;
init();
while(n--)
{
cin>>p;
if(p=='Q')
{
cin>>pos;
printf("%c\n",myquary(pos));
}
else
{
cin>>s>>pos;
myinsert(pos,s);
}
}
return 0;
}
POJ2887 Big String
最新推荐文章于 2018-08-28 11:19:00 发布