【POJ 2887】Big String 块状链表

7 篇文章 0 订阅
1 篇文章 0 订阅
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1000004
#define len 2000
struct BK{
    struct Node{
        char c[len];
        int size, ne;
        void init() {
            size = 0, ne = -1;
        }
    }node[len];
    int head, tot;
    void init(char *s) {
        head = tot = 0;
        node[0].init();
        int i, j, cur;
        for (i = 0, cur = head;s[i];cur = node[cur].ne) {
            for (j = 0;j < len && s[i];i++,j++) {
                node[cur].c[j] = s[i];
                node[cur].size++;
            }
            if (s[i]) {
                node[cur].ne = ++tot;
                node[tot].init();
            }
        }
        for (i = head;~i;i = node[i].ne) {
            if (node[i].size == len) spli(i);
        }
    }
    void spli(int id) {
        node[++tot].init();
        for (int i = len/2, j = 0;i < len;i++,j++) {
            node[tot].c[j] = node[id].c[i];
            node[id].size--, node[tot].size++;
        }
        node[tot].ne = node[id].ne;
        node[id].ne = tot;
    }
    char find(int p) {
        int cur = head;
        while (cur != -1 && node[cur].size < p) p-=node[cur].size, cur = node[cur].ne;
        return node[cur].c[p-1];
    }
    void ins(int p, char s) {
        int cur = head;
        while (node[cur].ne != -1 && p > node[cur].size) p-=node[cur].size, cur = node[cur].ne;
        if (p >= node[cur].size) node[cur].c[node[cur].size] = s;
        else {
            for (int i = node[cur].size;i > p;i--) node[cur].c[i] = node[cur].c[i-1];
            node[cur].c[p] = s;
        }
        node[cur].size++;
        if (node[cur].size == len) spli(cur);
    }
}bk;
char s[N];
int main() {
   int i, n;
   char op[2], c;
   while (~scanf("%s", s)) {
        bk.init(s);
        scanf("%d", &n);
        while (n--) {
            scanf("%s", op);
            if (op[0] == 'Q') {
                scanf("%d", &i);
                printf("%c\n", bk.find(i));
            }else {
                scanf(" %c%d", &c, &i);
                bk.ins(i-1, c);
            }
        }
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值