1. 程式人生 > >塊狀鏈表題*1

塊狀鏈表題*1

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