2009年6月14日10:00-18:00,2009百度之星大赛在线晋级赛(复赛)展开。百度爱好者给大家带了复赛题目,供有兴趣的朋友研究。复赛共四题,分别是高频Query的识别 (100分)、图形检索 (100分)、网页的相似度计算 (100分)、拼车 (100分),总计400分。
1. 高频Query的识别 (100分)
内存限制:1MB
题目描述
百度每天都会接受数亿的查询请求, 如何在这么多的查询(Query)中找出高频的Query是一个不小的挑战. 而你的任务则更加艰巨, 你需要在极其有限的资源下来找出这些高频的Query.(使用内存不得多于1MB, 本题的规定覆盖其它地方的规定)
关于内存限制: 我们评测程序计算内存使用量的方法是将选手程序实际使用的内存减去以下空程序实际使用的内存.
#include <cstdio>
#include <iostream>
#include <string>
int main() { }
注意,测试的机器是64位的.在测试机上下面代码输出: 8 8 4 2
#include <stdio.h>
int main() {
printf(”%d %d %d %d/n”, sizeof(long), sizeof(int*), sizeof(int), sizeof(short));
}
关于时间限制: 下面是一个能得到正确输出的程序,你的程序使用的时间不能大于以下程序的运行时间(对相同的输入, g++ -O2编译).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
const int L = 16+1;
char buf[L];
char out[100][L];
while(scanf(”%s”, buf)==1) {
int p = 0;
for(int i=0; i<200; i++)
p = rand()%100;
strcpy(out[p], buf);
}
for(int i=0; i<100; i++)
if(strlen(out[i])>0)
printf(”%s/n”, out[i]);
}
输入格式
一行一个Query, 以文件结束符结尾。每个Query字节数L(一个汉字两个字节)满足:0<L<=16. 输入大小不超过1GB(包括换行符)。
输出格式
你认为最高频的100个query. 每行一个, 不能有重复, 不能多输出, 但可以少输出(见样例).
样例输入
美女
帅哥
美女
百度
美女
百度
百度
美女
美女
美女
样例输出
百度
美女
评分方法
如果你的程序运行超时或使用内存峰值超过限制,那么你的得分为0. 否则得分非0.你的得分是你输出的query的实际频次的总和(在样例中为3+6=9)在所有有提交的选手中的排序而定.
具体来说, 设测试点分数为S, 得分非0的程序数为 M ,比程序 i 的方案严格更优(实际频次的总和更大)的程序数为 Y(i) ,则该测试点程序 i 的分值为 S(1-Y(i)/M) 。换句话说,输出该测试点最优解的程序将获得 S 分,而最差解惟一的情况,输出最差解(但合法)的选手将得到 S/M 分。注意:每个测试点的得分不必为整数。
提示,请使用C语言的stdio函数而不要使用iostream,否则在I/O速度上会处于明显劣势。
2. 图形检索 (100分)
时间限制:10秒(12:09更新)
题目描述
和人类一样,度度熊也喜欢上网搜美女的图片,不过和人类不同,他搜的是熊熊。 他经常发现现有的搜索功能无法满足他的要求。看到喜欢的熊熊就喜欢狂搜那个熊熊的其他图片。遗憾的是人类并没有给每个熊起个名字,他非常羡慕人类可以用“金泰熙生活照”这样精确的Query来进行图片搜索。 有一天他终于受不了了,决定开发一个“度度熊”图片检索系统。 目的就是从一张图片出发, 检索和该图片相似的图片。
这可不是一件容易的事情,度度熊心里当然很清楚。因此他要先实现一个简化版的检索系统. 具体的描述如下:
系统目标: 给定任意一张包含特定图形的位图,从一列候选集中,正确检索出与之相似的结果.
检索对象: 黑白位图(即0/1 bitmap), 尺寸统一为180*180,其中每一个点Px,y保存像素点的颜色,1表示黑色,0表示白色。
输入格式
只有一个测试点, 共X=150幅图像, 分为M=15个类别, 每个类别N=10个样本。在人眼看来,每个类别中的样本两两相似,但任意两个不同类别的图像都不相似。
每幅图像(按照输入顺序依次编号为0..X-1)包含180行, 每行180个字符(为0或1), 字符之间无空白. 不同图像间用单个空行隔开.没有多余的输入(即保证只有X幅图像)
输出格式
共X行, 其中第i行用10个整数描述图像i的相似图像的序号,按照相似度降序排列(即:越接近的图像越早出现)。
评分方法
对输入的每幅图像i,评测程序将给出一个原始得分R(i),然后计算出所有图像的总原始得分R=R(0)+R(1)+…+R(X-1)。 R越大,你的最终得分也越高,但具体分数还取决于其他选手的表现。
具体来说, 设原始分数非0的程序数为M ,比程序i严格更优(总原始得分R更大)的程序数为Y(i),则程序i的最终得分为本题总分的100(1-Y(i)/M)%。换句话说,原始分数最大的程序将获得本题 100% 的分数,而最差解惟一的情况,输出最差解(但合法)的选手将得到 100/M%的分数。注意:本题的最终得分不必为整数。
第i幅图像的原始得分R(i)在很大程度上取决于检索出的正确图像个数C。具体来说,当C=0时,R(i)=0,否则(C-1)2 < R(i) <= C2。当C相同时,设正确图像在输出序列中的编号分别为T0,T1,…,TC-1,则T=T0+T1+…+TC-1越小越好(这里不提供具体公式)。
测试数据
本题只有一组输入. 具体见”输入格式”的描述.
共12类别*6样本 = 72幅图像, 以及相应的0/1矩阵的输入文件sample.in,你可以使用该数据调试和测试你的程序. 压缩包里有一个 typerecord.txt 文件. 格式如下
0 1 13
表示13.bmp是第0个类别的第1个样本.
请注意样例数据和测试数据的图片个数是不同的.
3. 网页的相似度计算 (100分)
时限:1秒/CASE
题目描述
度度熊最近发现日本的互联网有很多恶意的作弊者用程序制造了大量的垃圾站点. 分布在成千上万的主域上, 这些站点初看起来感觉还行, 但当度度熊发现几千个格式一模一样的站点, 变化的只是其中的垃圾内容时, 度度熊觉得实在作呕. 例如下面这两个网站首页
他决定开发出一个工具, 这个工具可以用于自动比较两个网页间格式的相似程度.
网页的HTML标签信息组成了一棵(有根的)DOM树. TAG名就是树的结点的标签. 下面是一个例子:
<HTML>
<BODY>
<table>
<tr>
<td><img></img></td>
</tr>
<tr>
<td>
Welcome!
<br></br>
<a>Click Here!</a>
</td>
<td><img></img></td>
</tr>
</table>
</BODY>
</HTML>
图1
一棵”正则”的树是指结点数>1的树.
两个DOM树相等当且仅当根的标签相等且各个儿子结点对应的子DOM树也都对应相等(各兄弟结点之间的顺序是重要的)
一个树的子树是指去掉某一结点与其父亲的边后留下来的以该结点为根的树.
如上图中以TABLE结点为根的子树是
图2
一个树的”根余子树”是指去掉一系列的子树, 但不去掉子树的根后余下的树.
例如图1去掉2个以TR为根的子树后的”根余子树”是:
图3
一个树的”广义子树”是指某个子树的”根余子树”, 例如图2子树的一个”根余子树”如下:
图4
两个DOM树的相似度定义为这两个DOM树所拥有的共同的, ”正则”的 ”广义子树”的数目.
你的任务是给出N个HTML网页, 求出这N个网页的两两相似度(共N*(N-1)/2对).并按相似度从大到小排序输出.
由于内容信息是不重要的.故你可以把连续的文本当作一个单独的虚拟PURE_TEXT标签.准确来说,你必须将
<b> why why </b>
看作是
<a> <PURE_TEXT> </PURE_TEXT> </a>.
但要注意.连续的空白(空格,TAB,回车换行)不是TEXT,空白只起到分隔符的作用.如果网页中有PURE_TEXT标签,则和上述虚拟的PURE_TEXT标签同等对待.
输入格式
第一行N,表示有N个HTML. (2<=N<=10)
从第二行开始描述N个HTML,每个HTML的描述格式是
第一行URL,以http://开头。每个HTML的URL均不相同.
以下为HTML源码,直到一个以只有4个等号(====)的行表示结束.
为简单计,HTML里的标签只有名字,没有属性信息, 并且所有的标签都是成对出现的.如<br></br>.
标签名字不区分大小写(且不一定是标准的HTML标签). <br>和<Br>是相同标签.
用正则表达式表示如下,括号表示分组:
ID:=[a-zA-Z0-9]+
TEXT:=[a-zA-Z0-9<SPACE>]+
START_TAG:=<ID>
END_TAG:=</ID>
TREE:=EMPTY|TEXT|(START_TAG TREE END_TAG)
HTML:=<html>TREE</html>
其中<SPACE>指空白(空格,TAB,回车换行等等, 具体的说, 是c语言中isspace(c)为真的字符). 空白起到划分语法边界的作用, 因此可以出现在任意语法边界上. 如< / pre >是合法的.但< / p re>则不是合法的. 输入的HTML保证合法, 我们不会刻意出数据来测试选手对语法的理解(数据都是由真实的网页数据而来). 但选手最好作一些简单的容错. 如果我们的数据不严格符合上面的正则表达式. 但是95%的选手程序都会正确处理, 我们将认为数据是正常的. 比赛规则中保证输入一定为LINUX格式, 但此题不保证.
输入文件长度<=10MB. 总的标签数目(包括PURE_TEXT)<=10000.
输出格式
共N*(N-1)/2行.
每行格式为:
相似度<空格>对应的URL1<空格>对应的URL2
在同一行中,URL1和URL2按字典序排序(即URL1<URL2).
全部结果按相似度从大到小排序. 相似度相同的按URL1的字典序排序. 相似度保证小于64位有符号整数的最大值.
注意:我们的测试机器是64位, 故long可以保存得下相似度的结果. 请用scanf(”%ld”,&x)或cin>>x来读取long
样例输入
2
http://url_b/
<html>
<A>TEXT</a><br>T</br>TEXT
</html>
====
http://url_a/
<html>
<a>U</a><br>U</br>
</html>
====
样例输出
2 http://url_a/ http://url_b/
测试数据
共10组测试数据,测试数据是真实的网页数据(经过必要的转换以满足上述的格式描述和规模)加部分手工数据。
4. 拼车 (100分)
时间限制:10秒
题目描述
虽然北京的公交系统很发达, 但对上班一族来说, 出租车仍是很常用的交通工具. 度度熊就经常坐出租车上下班. 有一天他发现一个现象: 他的同事基本上都是每人单独坐一辆车,虽然有些人住在同一个方向,甚至同一个小区。他想, 可以考虑让大家拼车,即节约出租车资源,又可以减少大家的支出.
度度熊作了以下假定:
出租车最多一辆可以坐4个人(为简单计,不考虑像度度熊这样因体积太大而坐不了4个人的情况).
假设公路都是横平竖直的,可以用正方形框格来表示公路。相交的公路视为连通(可以在交叉点处从一条公路开到另一公路上)。车只可以在公路上走。
员工家都在公路的交叉点处。员工下班后,都从公司所在位置直接打的士回家。
每位员工只能乘坐一辆出租车到达目的地,不能中途下车,换乘其他出租车。
同往常一样, 度度熊只喜欢出主意, 却不喜欢写代码. 所以这个重任就只好落到你身上了:)
你的任务是写一个程序:求出一种员工打车方案,使得把所有员工送回家,在这种情况下, 要使所有的士所走的路程尽量短。
为了方便起见,用笛卡尔坐标系来描述员工家所在区域。假定员工家所在区域的长和宽均为9。
下面是公司所在位置为(3,3)时,坐标描述图:
图1. 公路示意图.
输入格式
输入包括: 公司位置,员工总人数 和 每个员工家所在的位置。
具体格式见下:
第1行:有1个数N(0<N<100),表示当天需要打的回家的员工总人数。
第2至N+1行,每行有2个整数,分别为Xi(0<=Xi<=8)和Yi(0<=Yi<=8),中间用空格隔开,表示员工i所要到达目的地的坐标。例如,第2行是员工1的家的坐标位置,第3行是员工2家的坐标位置,依次类推。不同员工的住址可能完全相同,员工的住址也可以和公司重合(可以在程序中直接忽略他)。
第N+2行有2个数,分别为M(0<=M<=8)和W(0<=W<=8),中间用空格隔开,表示公司的坐标。
输出格式
输出包括:总的最短公里数,所需车的数目,以及每辆车所载的员工(用坐标表示)和每辆车所走的路线(用坐标表示)。
具体格式见下:
第1行:总的最短公里数。
第2行:所需车的总数目,假定是C;
下面第3行至第C+2行,每一行输出包含三部分:
第一部分是该车所走路程;
第二部分是该车所载的员工,目的地坐标表示;
第三部分是该车所走的路线,用经过的交叉点坐标序列表示。
第一部分和第二部分之间用 空格 分割;
第二部分和第三部分之间用“:”分割。
样例输入
8
0 0
4 0
7 1
5 4
1 5
3 6
6 6
1 8
3 3
样例输出
29
4
6 (0,0) : (3,3) (2,3) (1,3) (0,3) (0,2) (0,1) (0,0)
8 (4,0) (7,1) : (3,3) (3,2) (3,1) (3,0) (4,0) (5,0) (6,0) (7,0) (7,1)
6 (5,4) (6,6) : (3,3) (4,3) (5,3) (5,4) (5,5) (5,6) (6,6)
9 (1,8) (1,5) (3,6) : (3,3) (3,4) (3,5) (3,6) (2,6) (2,5) (1,5) (1,6) (1,7) (1,8)
样例解释
输入的员工家、公司具体位置以及拼车方案见下图:
此例的一个打车方案为:
1号线路程为6公里,载1人。
2号线路程为8公里,载2人。
3号线路程为6公里,载2人。
4号线路程为9公里,载3人。
总计最短路程为29公里。
评分方法
如果你的程序输出方案非法, 那么你的得分为0. 否则得分非0.你的得分是由你的方案得到的总的最短公里数在所有有提交且得分非0的选手中的排序而定.
具体来说, 设测试点分数为S, 得分非0的程序数为 M ,比程序 i 的方案严格更优(总的公里数更小)的程序数为 Y(i) ,则该测试点程序 i 的分值为 S(1-Y(i)/M)。换句话说,输出该测试点最优解的程序将获得 S 分,而最差解惟一的情况,输出最差解(但合法)的选手将得到 S/M 分。注意:每个测试点的得分不必为整数。
测试数据
共25组,员工人数近似在[0,100]中均匀分布,公司位置和每个员工家所在位置都是随机生成的.