您的位置:首页 > 其它

POJ-2887(块状链表)

2015-02-21 00:10 411 查看
题目:http://poj.org/problem?id=2887

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



#include <cstdio>
#include <cstring>
#define MAX_LEN		6000
#define HALF_LEN	3000
#define MAX_COUNT	1000

struct 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 node
insert(q, ch, q->len);
}
else{//insert ch at pos - len
insert(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: