奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣。最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来。他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的。
帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相。他们在寻找长度在A到B之间(含)在每天的数据文件中重复得最多的比特序列 (1 <= A <= B <= 12)。他们在找那些重复得最多的比特序列。一个输入限制告诉你应输出多少频率最多的序列。
符合的序列可能会重叠,并且至少重复一次的序列会被计数。
格式
PROGRAM NAME: contact
INPUT FORMAT:
(file contact.in)
第一行:三个用空格分隔的整数: A, B, N; (1 <= N < 50)
第二行及以后: 一个最多200,000字符的序列,全是0或1; 每行有80个字符,除了可能的最后一行。
OUTPUT FORMAT:
(file contact.out)
输出N个频率最高的序列(按照频率由高到低的次序)。由短到长排列频率相同的这些序列,如果长短相同,按二进制大小排列。如果出现的序列个数小于N,输出存在的序列。
对于每个存在的频率,先输出单独包含该频率的一行,再输出以空格分隔的这些频率。每行六个(除非少于六个剩下)。
SAMPLE INPUT
2 4 10
01010010010001000111101100001010011001111000010010011110010000000
在样例里,序列100出现了12次,而序列1000出现了5次。次数最多的序列是00,出现了23次。
SAMPLE OUTPUT
23
00
15
01 10
12
100
11
11 000 001
10
010
8
0100
7
0010 1001
6
111 0000
5
011 110 1000
4
0001 0011 1100
【参考程序】:
/*
ID: XIONGNA1
PROG: contact
LANG: C++
*/#include<iostream>
#include<cstring>
using namespace std;
struct node
{
int sum;
string str;
} code1[16001],code2[16001];
int a,b,n;
string s1,s2;
int cmp(const void *s,const void *t)
{
node i=*(node *)s,j=*(node *)t;
return j.sum-i.sum;
}
bool bijiao(string a1,string a2)
{
if (a1.length()>a2.length()) return true;
if (a1.length()<a2.length()) return false;
for (int i=0;i<a2.length();i++)
if (a1[i]>a2[i]) return true;
else if (a1[i]<a2[i]) return false;
return false;
}
int main()
{
freopen("contact.in","r",stdin);
freopen("contact.out","w",stdout);
cin>>a>>b>>n;getchar();
string s; s1="";
while (cin>>s) s1=s1+s;
for (int i=0;i<=16000;i++) code1[i].sum=0;
int lens=s1.length(),k;
s1=' '+s1;
for (int i=a;i<=b;i++)
for (int j=1;j<=lens-i+1;j++)
{
s=s1.substr(j,i);
k=1;
for (int l=0;l<s.length();l++)
k=k*2+(s[l]-'0');
code1[k].sum++; code1[k].str=s;
}
int len=0;
for (int i=0;i<=16000;i++)
if (code1[i].sum)
{
len++;
code2[len].sum=code1[i].sum;
code2[len].str=code1[i].str;
}
qsort(code2+1,len,sizeof(node),cmp);
int x=1,y=1;
while (x<=len)
{
while (code2[y].sum==code2[y+1].sum) y++;
cout<<code2[x].sum<<endl;
for (int i=x;i<=y-1;i++)
for (int j=i+1;j<=y;j++)
if (bijiao(code2[i].str,code2[j].str))
{
s=code2[i].str;code2[i].str=code2[j].str;code2[j].str=s;
}
for (int i=x;i<=y;i++)
if ((i-x+1)%6==0 || i==y)
cout<<code2[i].str<<endl;
else cout<<code2[i].str<<' ';
x=y+1;y=x;
n--; if (n==0) break;
}
return 0;
}