块状链表求助
  • 板块题目总版
  • 楼主_Life_
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/3/3 07:31
  • 上次更新2023/11/5 02:30:47
查看原帖
块状链表求助
87434
_Life_楼主2021/3/3 07:31

POJ2887 Big String 孩子T飞了jk

题目只要求单点插入、单点查询

#include<cstdio>
#include<cstring>
using namespace std;
int allsize,nodenum,sqrtk;
struct node
{
	int size,next=-1;
	char data[2005];
}x[2005];
int find(int &pos)
{
	int i=0;
	while(x[i].size<pos)
	{
		pos-=x[i].size;
		i=x[i].next;
	}
	return i;
}
char query(int pos)
{
	int k=find(pos);
	return x[k].data[pos];
}
void split(int k)
{
	nodenum++;
	x[nodenum].next=x[k].next;
	x[k].next=nodenum;
	memcpy(x[nodenum].data,&x[k].data[x[k].size/2],x[k].size-x[k].size/2);
	x[nodenum].size=x[k].size-x[k].size/2;
	x[k].size/=2;
}
void insert(int pos,char ch)
{
	int k=find(pos);
	for(int i=x[k].size;i>=pos;i--)
		x[k].data[i+1]=x[k].data[i];
	x[k].data[pos]=ch;
	x[k].size++;
	allsize++;
	if(sqrtk*sqrtk<allsize)
		sqrtk++;
	if(x[k].size>=2*sqrtk)
		split(k);
}
int n,m;
char str[1000001];
int main()
{
	scanf("%s",str);
	m=strlen(str);
	for(int i=0;i<m;i++)
		insert(i,str[i]);
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		char op;
		scanf(" %c",&op);
		if(op=='Q')
		{
			int pos;
			scanf("%d",&pos);
			pos--;
			printf("%c\n",query(pos));
		}
		if(op=='I')
		{
			int pos;
			char ch;
			scanf(" %c %d",&ch,&pos);
			pos--;
			insert(pos,ch);
		}
	}
}
2021/3/3 07:31
加载中...