【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 输入 ...
随机推荐
- open和fopen的区别(转)
转载自:http://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.html open和fopen的区别: 1.缓冲文件系统缓 冲文件系 ...
- javascript 基础学习整理
1. javascript是动态语言,脚本语言,弱类型语言. 2. javascript代码在html文件中的位置安排,放在<body></body>内部与外部的区别.如何引用 ...
- 【转】Chrome保存mhtml网页文件的方法 – 无需任何插件,完美!
原文网址:http://www.ihacksoft.com/chrome-save-mht.html 在 Chrome 地址栏中键入“chrome://flags”,回车,这是一个 Chrome 的功 ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 解决mysql不能远程登录的问题
1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- Java调用R(三)_系统命令调用
java通过配置的系统命令Rscript直接调用R脚本. 优点:R脚本和Java代码完全分离 缺点:R中变量不能控制 1. Java本地能够成功调用. public void CallR() { Ru ...
- OpenRisc-43-or1200的IF模块分析
引言 “喂饱饥饿的CPU”,是计算机体系结构设计者时刻要考虑的问题.要解决这个问题,方法大体可分为两部分,第一就是利用principle of locality而引进的cache技术,缩短取指时间,第 ...
- eclipse下开发简单的Web Service
service部分 在eclipse下新建一个动态web项目 在项目中新建一个service类 编写SayHello类的代码 package org.sunny.service; //包不要引用错了 ...
- 发起SSH攻击主机IP地址列表
发起SSH攻击主机IP地址列表 东北大学 http://antivirus.neu.edu.cn/scan/ssh.php 以下IP地址对SSH服务进行攻击,严重增加主机成为肉鸡的可能性.强烈建议网管 ...
- Unity3D 集成 Face++ FacePlusPlus httpClient http协议 byte数组转string
//開始由于要实现跨平台.考虑过用curl封装c++的dll(android *.so)的方式,在c#Dllimport实现 //后来发现Unity3D本身支持http协议.且face++的api都是 ...