记录编号 128551 评测结果 AAAAAA
题目名称 [Vocaloid]双子的混唱 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2014-10-17 21:01:14 内存使用 0.39 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct www{
	int shi,zuicd,mu;
	www(){shi=0;zuicd=0;mu=0;}
	bool operator<(const www&z) const {return zuicd<z.zuicd;}
} song[20];
vector<www> mi0,mi1,mi2;
vector<www>::iterator A;
int next[20010]={0},k,i,p,cd,h,j,zui=0,aiky=0,misaki=0,miku=0,n,m,t,zj1,zj2;
string s1,s2;
void get_next()
{
	memset(next,0,sizeof(next));j=0;
	for(i=1;i<cd;i++)
	{
		while(j&&(s1[j]!=s1[i]))j=next[j];
		if(s1[j]==s1[i])next[i+1]=++j;
		else next[i+1]=0;
	}
	j=0;zui=0;
	for(i=0;i<cd;i++)
	{
		while(j&&(s1[j]!=s2[i]))j=next[j];
		if(s1[j]==s2[i]){j++;if(j>zui)zui=j;}
	}
}
void init()
{
	cin>>s1;
	cin>>s2;
	s1.erase(0,h);
	s2.erase(0,h);
	cd=s1.size();
	get_next();
}
void vocaloid(int x,int xu)
{
	mi1.push_back(song[xu]);
	mi0.clear();mi0.insert(mi0.begin(),mi1.begin(),mi1.end());
	sort(mi0.begin(),mi0.end());
	p=0;aiky=0;
	for(A=mi0.begin();A!=mi0.end();A++){p++;aiky+=(*A).zuicd*p;}
	if(aiky>miku)
	{
		miku=aiky;
		mi2.clear();mi2.insert(mi2.begin(),mi0.begin(),mi0.end());
	}
	for(int e=xu+1;e<=n;e++)
	{
		zj1=x+song[e].shi;
		if(zj1<=t) vocaloid(zj1,e);
	}
	mi1.pop_back();
}
int main()
{
	freopen("rinlen.in","r",stdin);
	freopen("rinlen.out","w",stdout);
	scanf("%d%d%d\n",&n,&m,&t);
	for(int w=1;w<=n;w++)
	{
		song[w].mu=w;
		scanf("%d%d\n",&h,&song[w].shi);
		init();
		song[w].zuicd=zui;
	}
	for(i=1;i<=n;i++) aiky+=song[i].shi;
	if(aiky<=t)
	{
		sort(song+1,song+(n+1));
		aiky=0;
		for(i=1;i<=n;i++)aiky+=i*song[i].zuicd;
		if(aiky<m) printf("QwQ\n");
		else
		{
			printf("%d %d\n",n,aiky);
			for(i=1;i<n;i++)printf("%d ",song[i].mu);
			printf("%d\n",song[n].mu);
		}
	}
	else
	{
		for(i=1;i<=n;i++)
		{
			if(song[i].shi<=t)
			vocaloid(song[i].shi,i);
			mi1.clear();
		}
		if(miku<m) printf("QwQ\n");
		else
		{
			misaki=mi2.size(); 
			printf("%d %d\n",misaki,miku);
			for(A=mi2.begin();A!=mi2.end();A++)
			printf("%d ",(*A).mu);
			printf("\n");
		}
	}
	return 0;
}