【描述】

奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣。最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来。他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的。

帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相。他们在寻找长度在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,输出存在的序列。

对于每个存在的频率,先输出单独包含该频率的一行,再输出以空格分隔的这些序列。每行六个(除非少于六个剩下)。

【分析】

直接上字典树。

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
const int maxnode=;
const int maxl=+;
const int maxn=+;
using namespace std;
struct Tire
{
int ch[maxnode][];
int val[maxnode],sz,father[maxnode];
Tire(){memset(ch[],,sizeof(ch[]));val[]=;sz=;father[]=-;}
void insert(char *t,int from,int to)
{
int i,u=;
for (i=from;i<=to;i++)
{
int c=(t[i]==''?:);
if (!ch[u][c])//没有建立过该节点
{
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
father[sz]=u;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]++;//累加
}
}tire;
bool check(int a,int b)
{
char A[],B[];
int pa=,pb=;
while (tire.father[a]!=-)
{
int u=tire.father[a];
if (tire.ch[u][]==a) A[pa++]=;else A[pa++]=;
a=tire.father[a];
}
while (tire.father[b]!=-)
{
int u=tire.father[b];
if (tire.ch[u][]==b) B[pb++]=;else B[pb++]=;
b=tire.father[b];
}
if (pa>pb) return ;else if (pb>pa)return ;
for (int i=pa-;i>=;i--) if (A[i]>B[i]) return ;else if (B[i]>A[i]) return ;
}
struct Ans
{
int num;//节点编号
int cnt;//统计数量
bool operator < (const Ans&b)const
{
if (cnt==b.cnt) return check(num,b.num);
return cnt>b.cnt;
}
}ans[maxn];
int f=;
char str[maxl],temp;
void print(int num,int flag);
int main()
{
int len=,a,b,n,i,j,k,ans_point=;
int n1=;//用来统计已经输出过的频率;
//文件操作
freopen("contact.in","r",stdin);
freopen("contact.out","w",stdout);
scanf("%d%d%d",&a,&b,&n);
while (scanf("%c",&temp)!=EOF) if (temp=='' || temp=='') str[len++]=temp; for (i=;i<len;i++)
{
if (i+a->=len) break;
for (j=i+a-;j<=min(i+b-,len-);j++) tire.insert(str,i,j);//插入
}
for (i=;i<tire.sz;i++) if (tire.val[i]!=) {ans[ans_point].num=i;ans[ans_point++].cnt=tire.val[i];}
sort(ans,ans+ans_point);
//for (i=0;i<ans_point;i++) printf("%d\n",ans[i].cnt);
f=;
for (i=;;i++)
{
if (i==ans_point) break;
if (i== || ans[i].cnt!=ans[i-].cnt)
{
n1++;
if (n1>n) break;
print(ans[i].num,);
}//打印
else print(ans[i].num,);
f=;
}
return ;
}
void print(int num,int flag)
{
int t=,i;
if (flag== && f==) printf("\n%d\n",tire.val[num]);
else if (flag== && f==) printf("%d\n",tire.val[num]);
char temp[];
while (tire.father[num]!=-)
{
int u=tire.father[num];
if (tire.ch[u][]==num) temp[t++]=;
else temp[t++]=;
num=tire.father[num];
}
for (i=t-;i>=;i--) printf("%c",char(temp[i]+''));
printf(" ");
}

【USACO 3.1.5】联系的更多相关文章

  1. USACO . Your Ride Is Here

    Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs often co ...

  2. 【USACO 3.1】Stamps (完全背包)

    题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...

  3. USACO翻译:USACO 2013 NOV Silver三题

    USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...

  4. USACO翻译:USACO 2013 DEC Silver三题

    USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...

  5. USACO翻译:USACO 2014 DEC Silver三题

    USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 马拉松 奶牛慢跑 英文题目名称 piggyback marathon cowjog 可执行文件名 piggyback ma ...

  6. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  7. USACO翻译:USACO 2012 JAN三题(3)

    USACO 2012JAN(题目三) 一.题目概览 中文题目名称 放牧 登山 奶牛排队 英文题目名称 grazing climb lineup 可执行文件名 grazing climb lineup ...

  8. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  9. USACO翻译:USACO 2012 JAN三题(1)

    USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...

  10. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

随机推荐

  1. Unity 技能按钮触发特效

    unity 版本:4.5.1 NGUI版本:3.6.5 首先,要导入特效资源包,导入应该是基本中的基础,但是对于初学者来说好像很少有这方面的介绍,也许是我现学现用书看的不够认真,因为导入这个问题卡了好 ...

  2. Building a Space Station(kruskal,说好的数论呢)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3820   Accepted: 1950 Description You a ...

  3. 【转】爱普生打印机L358

    原文网址:http://www.chiphell.com/thread-838403-1-1.html 儿子幼儿园老是要打印作业,就决定用他的压岁钱买个打印机,主要以文件打印为主,兼顾照片.昨天网上一 ...

  4. 【STL】【模拟】Codeforces 696A Lorenzo Von Matterhorn

    题目链接: http://codeforces.com/problemset/problem/696/A 题目大意: 一个满二叉树,深度无限,节点顺序编号,k的儿子是k+k和k+k+1,一开始树上的边 ...

  5. 调用系统api修改系统时间

    一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  6. Ancient Message (古埃及象形文字识别 Uva 1103)

    原题:https://uva.onlinejudge.org/external/11/1103.pdf 给一幅图(16进制), 判断图中有哪些象形文字. 只识别 这6个就可以 示例: 将16进制数据 ...

  7. 遇到sql server的问题时如何排查

    The First Things I Look At On A SQL Server和Page2介绍了遇到sql server的问题时如何排查问题,Display Code列出了sql代码. 包括如下 ...

  8. ASP.NET 防盗链的实现[HttpHandler]

    本文转载:http://www.cnblogs.com/eflylab/archive/2008/06/16/1223373.html 有时我们需要防止其他网站直接引用我们系统中的图片,或下载文件链接 ...

  9. What is therelationship between @EJB and ejb-ref/ejb-local-ref?

    http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html What is therelationship between @EJB and ejb-ref/ ...

  10. caffe源代码分析--math_functions.cu代码研究

    当中用到一个宏定义CUDA_KERNEL_LOOP 在common.hpp中有. #defineCUDA_KERNEL_LOOP(i,n) \ for(inti = blockIdx.x * bloc ...