POJ-2887(块状链表)

来源:互联网 发布:linux编程实践教程 编辑:程序博客网 时间:2024/05/18 21:43

题目:http://poj.org/problem?id=2887

我的块状链表第一题,调了好久~~~~(>_<)~~~~ ,好在从思路到编码到调试都是自己搞的


#include <cstdio>#include <cstring>#define MAX_LEN6000#define HALF_LEN3000#define MAX_COUNT1000struct Node{char   str[MAX_LEN];size_t len;Node*  next;} node[MAX_COUNT] = {0};size_t nex = 0;inline Node* newNode(){return node + nex++;}struct BigString{Node* head;BigString(const char* s, size_t n){head = newNode();if(n <= HALF_LEN){memcpy(head->str, s, n);head->len = n;return;}memcpy(head->str, s, HALF_LEN);head->len = HALF_LEN;Node* p = head;size_t i = HALF_LEN;for(; i + HALF_LEN < n; i += HALF_LEN){p->next = newNode();memcpy(p->next->str, s + i, HALF_LEN);p->next->len = HALF_LEN;p = p->next;}p->next = newNode();memcpy(p->next->str, s + i, n - i);p->next->len = n - i;}void insert(Node* p, char ch, size_t pos){memmove(p->str + pos + 1, p->str + pos, p->len - pos);p->str[pos] = ch;++p->len;if(p->len < MAX_LEN) return;Node* q = p->next;p->next = newNode();memcpy(p->next->str, p->str + HALF_LEN, HALF_LEN);p->next->len = HALF_LEN;p->next->next = q;p->len = HALF_LEN;}void insert(char ch, size_t pos){Node* p = head, *q;size_t len = 0;while(p && len + p->len <= pos){len += p->len;q = p;p = p->next;}if(!p){//append ch at last nodeinsert(q, ch, q->len);}else{//insert ch at pos - leninsert(p, ch, pos - len);}}char operator[](size_t pos)const{Node* p = head;size_t len = 0;while(len + p->len <= pos){len += p->len;p = p->next;}return p->str[pos - len];}};char s[1000005];int main(){gets(s);BigString bs(s, strlen(s));int n, i;for(scanf("%d", &n); n--; ){scanf("%s", s);if(s[0] == 'Q'){scanf("%d", &i);putchar(bs[i - 1]);putchar('\n');}else{scanf("%s%d", s, &i);bs.insert(s[0], i - 1);}}return 0;}


0 0