比赛 |
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;
}