比赛 20151028a 评测结果 AEEAAEEEEEEEEEEEEEEEEEEEEE
题目名称 复制&粘贴 最终得分 11
用户昵称 mikumikumi 运行时间 2.540 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2015-10-28 12:18:07
显示代码纯文本
#include<cstdio>
#include<list>
#include<string>
#include<cmath>
#include<iostream>
#include<deque>
using namespace std;
const int SIZEC=10010;
int K,M,N;
string str;
class miku
{
    public:
	int size;
	char s[SIZEC];
	miku()
	{
		size=0;
	}
	void print()
	{
		cout<<"size:"<<size<<endl;
		for(int i=1;i<=size;i++) cout<<s[i];
		cout<<endl;
	}
};
list<miku> G;
void out_G()
{
	string str;
	list<miku>::iterator it;
	for(it=G.begin();it!=G.end();it++)
	{
		miku tem=*it;
		//tem.print();
		for(int i=1;i<=tem.size;i++)
			str+=tem.s[i];
	}
	cout<<str<<endl;
}
int best=0;
list<miku>::iterator st,ed,id;
void initalize()
{
	miku tem;
	G.push_front(tem);
}
void read()
{
	scanf("%d%d",&K,&M);
	cin>>str;
	list<miku>::iterator it;
	best=sqrt(M+0.1);
	miku tem;
	initalize();
	for(int i=0;i<str.size();i++) 
	{
		tem.s[++tem.size]=str[i];
		if(tem.size==best)
		{
			G.push_back(tem);
			tem.size=0;
		}
	}
	G.push_back(tem);
}
list<miku>::iterator get(int x)
{
	list<miku>::iterator it;
	it=G.begin();
	while(it!=G.end()&&x>it->size)
	{
		x-=it->size;
		it++;
	}
	return it;
}
void splite(int x)
{
	list<miku>::iterator it;
	it=G.begin();
	while(x>it->size)
	{
		x-=it->size;
		it++;
	}
	miku tem;
	tem.size=it->size-x;
	for(int i=1;i<=tem.size;i++)
	{
		tem.s[i]=it->s[x+i];
	}
	it->size=x;
	//if(t==1) st=it;
	//else if(t==2) ed=it;
	//else if(t==3) id=it;
	G.insert(++it,tem);
}
void keep()
{
	list<miku>::iterator it,it2;
	it=G.begin();
	it++;
	while(it!=G.end())
	{
		while(it!=G.end()&&!G.empty()&&it->size==0) it=G.erase(it);
		if(it==G.end()) break;
		it2=it;it2++;
		if(it2==G.end()) break;
		if(it->size+it2->size<2*best)
		{
			//miku tem=*it,tem2=*it2;
			//tem=*it;
			//tem.print();
			//tem2.print();
			for(int i=1;i<=it2->size;i++) it->s[i+it->size]=it2->s[i];
			it->size+=it2->size;
			//out_G();
			G.erase(it2);
		}
		it++;
		//out_G();
	}
}
void de(int x)
{
	splite(x);
	list<miku>::iterator it;
	it=get(x);
	if(it==G.end()) return;
	it++;
	while(it!=G.end())
	{
		it=G.erase(it);
	}
}
void work()
{
	scanf("%d",&N);
	int a,b,c;
	list<miku>::iterator st,ed,id;
	for(int i=1;i<=N;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		splite(a);
		splite(b);
		splite(c);
		st=get(a);st++;
		ed=get(b);ed++;
		id=get(c);
		deque<miku> Q;
		while(st!=ed)
		{
			miku tem=*st;
			Q.push_back(tem);
			//tem.print();
			st++;
		}
		id++;
		for(int j=0;j<Q.size();j++) G.insert(id,Q[j]);
		//out_G();
		keep();
		de(M);
		//cout<<"********"<<endl;
	}
	de(K);
	out_G();
}
int main()
{
	freopen("copypaste.in","r",stdin);
	freopen("copypaste.out","w",stdout);
	read();
	work();
	return 0;
}