【USACO 3.1.5】联系
【描述】
奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣。最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来。他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的。
帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相。他们在寻找长度在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】联系的更多相关文章
- 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 ...
- 【USACO 3.1】Stamps (完全背包)
题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...
- USACO翻译:USACO 2013 NOV Silver三题
USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...
- USACO翻译:USACO 2013 DEC Silver三题
USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...
- USACO翻译:USACO 2014 DEC Silver三题
USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 马拉松 奶牛慢跑 英文题目名称 piggyback marathon cowjog 可执行文件名 piggyback ma ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- USACO翻译:USACO 2012 JAN三题(3)
USACO 2012JAN(题目三) 一.题目概览 中文题目名称 放牧 登山 奶牛排队 英文题目名称 grazing climb lineup 可执行文件名 grazing climb lineup ...
- USACO翻译:USACO 2012 JAN三题(2)
USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...
- USACO翻译:USACO 2012 JAN三题(1)
USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...
- USACO翻译:USACO 2013 JAN三题(1)
USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...
随机推荐
- LA3353
感觉好久没做网络流这类的题目都不快会做了 网络流建模之前首先要分析性质 选择要求每个点恰属一个环就代表每个点在选择的图中,只有唯一入度和唯一出度 那就简单了,对n个点拆点,对于原图的边i-->j ...
- 2015第37周一struts2 jstl 标签
1.在jstl中使用struts2 <c:forEach var="ee" items="${requestScope.serviceList}" &g ...
- poj3186 Treats for the Cows
http://poj.org/problem?id=3186 Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total S ...
- android网络图片的下载
android网络图片的下载 /** * Get image from newwork * * @param path * The path of image * @return byte[] * @ ...
- SRM 390(1-250pt)
DIV1 250pt 题意:给定整数n和k,问最少需要多少个n连接在一起形成的新整数t,使得t是k的倍数.如果不能形成倍数,输出-1.k <= 10^5,n <= 10^9. 解法:不断增 ...
- 从git上下载代码并导入eclipse
主要分为两步: 1.先从git下载代码到本地git仓库 2.eclipse import导入存在的maven项目
- php 利用第三方软件进行网页快照
网页快照有很多方法,具体的大家可以百度下.这里我复制一位别人的. 这里我只说下利用第三方软件(Web2Pic_Pro)实现. (1). 下载web2pic_pro软件.下载地址 http://isha ...
- DateGridew导出Excel表+常见错误提示
在敲机房收费系统的时候,显示数据的时候需要将DateGridew 中的数据导出进Excel表.DateGridew导出Excel表是比较常见的,当然导出Excel表有很多种方法,下面是个人认为比较容易 ...
- 计数dp-hdu-4054-Number String
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 题目大意: 给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D ...
- 在Eclipse中使用JUnit4进行单元測试(0基础篇)
本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...