【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 输入 ...
随机推荐
- Lua I/0输入输出
I/O库为文件操作提供了两种不同的模型,简单模型和完整模型.简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件.完整模型则使用显式的文件句柄,并将所有的操作定义为文件句柄上 ...
- Linux Shell编程(9)——特殊变量类型
局部变量局部变量只在代码块或一个函数里有效 (参考函数里的局部变量)环境变量这种变量会影响Shell的行为和用户接口 在大多数情况下,每个进程都会有一个"环境表", 它由一组由进程 ...
- javascript 基础学习整理
1. javascript是动态语言,脚本语言,弱类型语言. 2. javascript代码在html文件中的位置安排,放在<body></body>内部与外部的区别.如何引用 ...
- 【转】android ListView详解---- 不错不错
原文网址:http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 由于google doc 很多人都打不开,故更新了源码下载地址 [源 ...
- Power Calculus 快速幂计算 (IDA*/打表)
原题:1374 - Power Calculus 题意: 求最少用几次乘法或除法,可以从x得到x^n.(每次只能从已经得到的数字里选择两个进行操作) 举例: x^31可以通过最少6次操作得到(5次乘, ...
- selenium grid java 资料
Grid TestNG: 使用Selenium Grid改进Web应用程序的测试: http://www.ithov.com/server/117464.shtml
- Period - HDU 1358(next求循环节)
题目大意:有一个长N的字符串,如果前缀Ni是一个完全循环的串(循环次数大于1),输出Ni和它循环了多少次. 分析:输入next的应用,求出来next数组直接判断Ni是否是完全的循环就行了,也就是N ...
- 环境搭建之maven分布式系统
shoppingmall项目: 一.父工程 shoppingmall-parent (packaging为pom) 此是本项目的顶级工程,所有子工程都应该继承他,主要可承担以下任务: a.集中定义 ...
- Lucene实例教程
Lucene是apache组织的一个用java实现全文搜索引擎的开源项目. 其功能非常的强大,api也很简单.总得来说用Lucene来进行建立 和搜索和操作数据库是差不多的(有点像),Document ...
- 10th day
貌似有几天没写博客了额.... 现在学习MySQL数据库,难度并不是很大,只是需要记忆的知识点比较多,好多语法之类的,比较容易混淆,而且老师讲课的速度还是蛮快的,虽然部分同学觉得听起来有点吃力,不过我 ...