POJ-2887(块状链表)

本文介绍了一种使用块状链表来高效处理大字符串的方法,并通过POJ 2887题目的实例展示了其具体实现过程。该方法能够有效支持插入操作,并通过分块减少内存碎片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值