【描述】

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

帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相。他们在寻找长度在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. zabbix 默认item采集使用被动模式 需要改为主动模式

    数据采集的工作模式可以分为被动模式(服务器端到客户端采集数据) 主动模式(客户端主动上报数据到服务器端) 服务器配置: DBHost=192.168.32.55 DBName= zabbix DBUs ...

  2. 一键源码安装Ansible

    #!/bin/bash # @Name:install_ansible.sh # @Author:Eivllom # @Create -- # @Modify -- app_soft="/a ...

  3. 数学概念——F 概率(经典问题)birthday paradox

    F - 概率(经典问题) Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  4. MyEclipse里项目部署到tomcat上之后,tomcat webpps文件夹里为什么找不到这个项目

         今天在MyEclipse中部署了一个java web项目,然后发现报404错误,跑到tomcat目录下的webapps文件夹里并发现没有这个项目,才发现MyEclipse没有写入webapp ...

  5. 《algorithm puzzles》——概述

    这个专题我们开始对<algorithm puzzles>一书的学习,这本书是一本谜题集,包括一些数学与计算机起源性的古典命题和一些比较新颖的谜题,序章的几句话非常好,在这里做简单的摘录. ...

  6. ReportViewer中设置ServerReport.ReportServerCredentials属性的方法

    当使用SSRS技术来布置报表,可能使用MS自带的ReportViewer控件来读取报表. 它分为Web和Windows两种版本;此处Web版. ServerReport.ReportServerCre ...

  7. ubuntu忘记密码

    Do these two things just to make sure: mount -o remount,rw / This first part remounts the root parti ...

  8. spring注解方式实现定时器,并且cron表达式中不识别L的方法

    1.Spring的配置: <beans xmlns:task="http://www.springframework.org/schema/task" xsi:schemaL ...

  9. python通过SMTP发送邮件失败,报错505/535

    python通过SMTP发送邮件失败:错误1:smtplib.SMTPAuthenticationError: (550, b'User has no permission')    我们使用pyth ...

  10. Android Dialog触摸对话框外部让其消失的实现方法

    方法一: @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent ...