你需要编写一个交互式程序,给定一系列维基百科摘录(见下文示例),依次猜测每段摘录的语言。在每次猜测后,你的程序会获得正确答案,以便它能在后续的运行中学习并做出更好的猜测。
每种语言由一个 $0$ 到 $55$ 之间的数字 $L$ 表示。每段摘录恰好包含 $100$ 个符号,表示为一个由 $100$ 个 $1$ 到 $65\,535$ 之间的整数组成的数组 $E$。这些 $1$ 到 $65\,535$ 之间的整数是任意分配的,并不对应任何标准编码。
你需要实现过程 excerpt(E),其中 $E$ 是一个包含 $100$ 个数字的数组,代表上述的维基百科摘录。你的实现必须调用一次 language(L),其中 $L$ 是你对该摘录所属维基百科语言版本的猜测。评测服务器实现了 language(L),它会对你的猜测进行评分并返回正确的语言。也就是说,如果 language(L) = L,则猜测正确。
评测服务器会调用 excerpt(E) $10\,000$ 次,即输入文件中的每一段摘录调用一次。你实现的准确率是 excerpt(E) 猜对语言的摘录所占的比例。
你可以使用任何你希望的方法来解决这个问题。Rocchio 方法是一种可以达到约 $0.4$ 准确率的方法。Rocchio 方法计算 $E$ 与目前为止所见过的每种语言 $L$ 的相似度,并选择最相似的语言。相似度定义为 $E$ 中出现在该语言 $L$ 的先前摘录中的不同符号的总数。
注意,输入数据下载自真实的维基百科文章,其中可能包含少量格式错误的字符或文本片段。这是预料之中的,也是任务的一部分。
样例
仅作说明,我们展示了来自 $56$ 种特定语言维基百科的摘录的文本表示:
- Yshokkie word meestal in Kanada , die noorde van die VSA en in Europa gespeel. Dit is bekend as 'n b
- وهو المنتج الذي يجعل المنظم ال يكسب ربحا وال يخسر ويحصل على ، Producer Marginal المنتج الحدي دخل يكف
样例输入文件 grader.in.1 包含 $10\,000$ 个这样的示例。这 $56$ 种语言是 IOI 2010 注册数据中列为“母语”的语言。每段摘录的语言是从这 $56$ 种语言中随机选择的,每段摘录取自相应维基百科版本中随机选择的一篇文章的第一段。文件的每一行包含:
- 维基百科语言版本的两个字母 ISO 代码;
- $100$ 个 $1$ 到 $65\,535$ 之间的数字,按顺序表示文章第一段的前 $100$ 个符号;
- 这 $100$ 个符号的可视化表示(UTF-8 编码),你可以在文本编辑器或 Firefox 浏览器中阅读。此可视化表示仅供你参考,不打算作为你程序的输入。
官方评测器使用 $10\,000$ 个不同的摘录,以相同的方式从相同的 $56$ 个维基百科版本中选择。但是,评测器会为每种语言分配一个 $0$ 到 $55$ 之间的不同数字,并为每个符号分配一个 $1$ 到 $65\,535$ 之间的不同数字。
子任务
子任务 1 [30 分]
你的提交在评测服务器上必须达到 $0.3$ 或更高的准确率。
子任务 2 [最高 80 分]
你的得分将为 $114(\alpha-0.3)$,四舍五入到最接近的整数,其中 $\alpha$ 是你提交的准确率。
实现细节
- 实现文件夹:
/home/ioi2010-contestant/language/ - 选手需要实现:
lang.c或lang.cpp或lang.pas - 选手接口:
lang.h或lang.pas - 评测器接口:
grader.h或graderlib.pas - 样例评测器:
grader.c或grader.cpp或grader.pas以及graderlib.pas - 样例评测器输入:
grader.in.1- 注意:输入文件的每一行包含:两个字符的语言代码;由空格分隔的 $100$ 个数字表示的摘录;摘录的文本表示。
- 样例评测器输入的预期输出:如果实现针对 $10\,000$ 个示例中的每一个都按规定调用了
language,样例评测器将输出OK alpha,其中alpha是准确率。 - 编译并运行(命令行):
runc grader.c或runc grader.cpp或runc grader.pas - 编译并运行(gedit 插件):编辑任何实现文件时按
Control-R。 - 提交(命令行):
submit grader.c或submit grader.cpp或submit grader.pas - 提交(gedit 插件):编辑任何实现或评测文件时按
Control-J。