记录编号 38132 评测结果 AAAATTT
题目名称 [IOI 1998][USACO 3.1] 联系 最终得分 57
用户昵称 GravatarMakazeu 是否通过 未通过
代码语言 C++ 运行时间 3.181 s
提交时间 2012-04-13 15:16:22 内存使用 0.69 MiB
显示代码纯文本
/*
ID:zyfwork1
LANG:C++
TASK:contact
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#define loop(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const char base='0';
const int sonnum=2;
class Trie{public:bool isStr;class Trie *son[sonnum]; int pos;};
class mystring{public:int times;char s[13];}S[100000];
int A,B,N,M,top=0;
char str[200010];
Trie *Root;
Trie *NewTrie() 
{
	Trie *temp=new Trie; loop(i,0,sonnum-1) temp->son[i]=NULL; 
	temp->isStr=false,temp->pos=0; return temp;
}
void Find(Trie *pnt,int start,int len)
{
	Trie *temp=pnt; loop(i,start,start+len-1)
	{
		if(temp->son[str[i]-base]==NULL)
			temp->son[str[i]-base]=NewTrie();
		temp=temp->son[str[i]-base];
	}
	if(!temp->isStr) 
	{
		temp->isStr=true; M++; temp->pos=M;
		S[M].times=1; memset(S[M].s,'\0',sizeof(S[M].s));
		loop(i,start,start+len-1) S[M].s[i-start]=str[i]; return;
	}
	S[temp->pos].times++;
}

inline bool cmp(const mystring& a,const mystring& b)
{
	if(a.times!=b.times) return a.times>b.times;
	int al=strlen(a.s),bl=strlen(b.s);
	if(al!=bl) return al<bl; 
	if(strcmp(a.s,b.s)>0) return 0;
	return 1;
}

void init()
{
	scanf("%d %d %d\n",&A,&B,&N);Root=NewTrie();
	char c; while(scanf("%c",&c)!=EOF) {if(c=='0' || c=='1') str[top++]=c;}
	for(int i=A;i<=B;i++)
		for(int len=0;len+i<=(int)strlen(str);len++)
			Find(Root,len,i);
}

void solve() 
{
	sort(S+1,S+M+1,cmp);
	int p=1,n=0,now=-1994,pos=0;
	while(p<=M)
	{
		if(S[p].times!=now) 
		{
			if(n==N) break;
			if(n!=0) printf("\n"); n++;
			pos=0; printf("%d\n%s",S[p].times,S[p].s);
			now=S[p].times; p++; continue;
		}
		pos++; if(!(pos%6)) printf("\n%s",S[p].s);
		else printf(" %s",S[p].s);
		p++;
	}
	printf("\n");
}

int main()
{
	freopen("contact.in","r",stdin);
	freopen("contact.out","w",stdout);
	init();
	solve();
	return 0;
}