塊狀鏈表題*1
阿新 • • 發佈:2017-12-24
clas list cnblogs lis code ber turn table insert
poj 2887
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<string> #include<cstdio> #include<queue> #include<cmath> #define N 1000010 #define M 2005 using namespace std; class ListTable{ public: char ch[N]; int sum[N]; int num; int n,m; struct ListBlock{ int size; char data[M]; void push_back(char c){ size++; data[size]=c; } void insert(int pos,char c){ for(int i=size+1;i>pos;i--) data[i]=data[i-1]; data[pos]=c; size ++; } char getData(int pos){ return data[pos]; } }; ListBlock block[M]; void maintain(){ for(int i=1;i<=num;i++) sum[i]=sum[i-1]+block[i].size; } void init(){ num=sqrt((n+m)*1.0)+1; for(int i=0;i<n;i++) block[i/num+1].push_back(ch[i]); maintain(); } char query(int pos,int number){ return block[number].getData(pos); } void insert(int pos,int number,char c){ block[number].insert(pos,c); } char Query(int pos){ int p=lower_bound(sum+1,sum+1+num,pos)-sum; return query(pos-sum[p-1],p); } void Insert(char c,int pos){ int p=lower_bound(sum+1,sum+1+num,pos)-sum; insert(pos-sum[p-1] ,p,c); maintain(); } }f; int main(){ scanf("%s",f.ch); f.n=strlen(f.ch); scanf("%d",&f.m); f.init(); char s[3]; char c[3]; int p; for(int i=0;i<f.m;i++){ scanf("%s",s); if(s[0]=='Q'){ scanf("%d",&p); printf("%c\n",f.Query(p)); } else{ scanf("%s%d",c,&p); f.Insert(c[0],p); } } return 0; }
塊狀鏈表題*1