题目来源:http://poj.org/problem?id=2887
块状链表模板题
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define N 1000010
#define L 2020
char s[N],c,opt;
int n,pos;
struct block {
struct node {
char c[L];
int size,next;
void init () { size=0,next=-1; }
}edge[L];
int head,tot;
void init (char *s) {
int i,j,cur;
head=tot=0,edge[0].init();
for (i=0,cur=head;s[i];cur=edge[cur].next) {
for (j=0;j<L&&s[i];i++,j++) {
edge[cur].c[j]=s[i];edge[cur].size++;
}
if (s[i])
{ edge[cur].next=++tot;edge[tot].init(); }
}
for (i=head;~i;i=edge[i].next)
if (edge[i].size==L) split(i);
}
void split (int pos) {
int i,j;
edge[++tot].init();
for (i=L>>1,j=0;i<L;i++,j++) {
edge[tot].c[j]=edge[pos].c[i];
edge[pos].size--;edge[tot].size++;
}
edge[tot].next=edge[pos].next;
edge[pos].next=tot;
}
void locate (int &cur,int &pos) {
while (cur!=-1&&pos>edge[cur].size)
pos-=edge[cur].size,cur=edge[cur].next;
}
char find (int pos) {
int cur=head;locate(cur,pos);
return edge[cur].c[pos-1];
}
void insert (int pos,char s) {
int cur=head;locate(cur,pos);
if (pos>=edge[cur].size) edge[cur].c[edge[cur].size]=s;
else {
for (int i=edge[cur].size;i>pos;i--) {
edge[cur].c[i]=edge[cur].c[i-1];
}
edge[cur].c[pos]=s;
}
edge[cur].size++;
if (edge[cur].size==L) split(cur);
}
}B;
int main () {
scanf("%s",s); B.init(s);
scanf("%d",&n);
while (n--) {
while ((opt=getchar())!='Q'&&opt!='I');
if (opt=='Q') {
scanf("%d",&pos);
printf("%c\n",B.find(pos));
}
else {
scanf(" %c%d",&c,&pos);
B.insert(pos-1,c);
}
}
return 0;
}