USACO 2014 FEB自动打字{Silver题1}

自动打字{Silver1}

【问题描述】

贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息。

字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1,000,000,这些单词是无序的。现在给出N(1 <= N <= 1000)个询问,每个询问i包含一个的字符串s_i(每个字符串最多包含1000个字符)和一个整数K_i,对于所有以s_i为前缀的单词,其中按字典序排序后的第K_i个单词,求该单词在原字典里的序号。

【文件输入】

第一行为两个整数W和N。

接下来2..W+1行,每行一个单词;

接下来W+2..W+N+1行,一个整数和一个字符串,分别表示K_i和s_i。

【文件输出】

输出共N行,每行一个整数,表示位置,如果无解则输出-1。

【输入样例】

10 3

dab

ba

ab

daa

aa

aaa

aab

abc

ac

dadba

4 a

2 da

4 da

【输出样例】

3

1

-1

【样例说明】

以a为前缀的单词有{aa,aaa,aab,ab,abc,ac},第4个是ab,它在原字典中的位置是3,以da为前缀的单词有{daa,dab,dadba},第2个是dab,它在原字典中的位置是1,以da为前缀的第4个单词不存在。

思路:本题一开始听闻要使用trie树,结果后来发现原来不用trie树也可以AC。首先快排字符串,然后将以各个字母为开头的起始和终点处理出来,然后枚举就可以AC了。代码如下

 1 var
 2 str:array[0..30000]of string;
 3 s,e:array[‘a‘..‘z‘]of longint;                    //以各个字母为开头的起点和终点
 4 num:array[0..30000]of integer;
 5 w,n,i,j,k:longint;
 6 temp:string;
 7 ch:char;
 8
 9 procedure openit;
10  begin
11   assign(input,‘auto.in‘);assign(output,‘auto.out‘);
12   reset(input);rewrite(output);
13  end;
14
15 procedure closeit;
16  begin
17   close(input);close(output);
18  end;
19
20 procedure qsort(l,r:longint);                 //快排字符串
21  var i,j,p:longint;
22      m,q:ansistring;
23   begin
24    i:=l;j:=r;m:=str[(l+r) div 2];
25    repeat
26     while str[i]<m do inc(i);
27     while str[j]>m do dec(j);
28     if not (i>j) then
29      begin
30       q:=str[i];str[i]:=str[j];str[j]:=q;
31       p:=num[i];num[i]:=num[j];num[j]:=p;
32       inc(i);dec(j);
33      end;
34    until i>j;
35    if l<j then qsort(l,j);
36    if i<r then qsort(i,r);
37   end;
38
39 procedure datain;
40  var i:longint;
41   begin
42    readln(w,n);
43    for i:=1 to w do readln(str[i]);
44    for i:=1 to w do num[i]:=i;
45    qsort(1,w);
46    k:=2;ch:=str[1,1];s[ch]:=1;e[ch]:=1;
47    while k<=w do
48     begin
49      if str[k,1]<>ch then begin
50                            ch:=str[k,1];
51                            s[ch]:=k;e[ch]:=k;
52                           end
53                      else inc(e[ch]);
54      inc(k);
55     end;
56   end;
57
58
59 begin
60  openit;
61  datain;
62  for i:=1 to n do
63   begin
64    readln(k,ch,temp);
65    for j:=s[temp[1]] to e[temp[1]] do                   //枚举
66     if str[j]>=temp then break;
67    if (j+k-1>w) or (length(str[j+k-1])<length(temp)) then
68     begin
69      writeln(‘-1‘);
70      continue;
71     end;
72    j:=j+k-1;
73    if copy(str[j],1,length(temp))=temp then writeln(num[j])
74                                        else writeln(‘-1‘);
75   end;
76  closeit;
77 end.
时间: 2024-08-10 09:43:10

USACO 2014 FEB自动打字{Silver题1}的相关文章

USACO 2014 JAN 滑雪录像{silver题3}

滑雪录像{silver题3} [问题描述] 冬奥会的电视时刻表包含N (1 <= N <= 150)个节目,每个节目都有开始和结束时间.农民约翰有两台录像机,请计算他最多可以录制多少个节目. [文件输入] 第一行,一个整数N. 接下来N行每行两个整数,表示一个节目的开始和结束时间,范围为0..1,000,000,000. [文件输出] 一个整数,表示最多可以录制的节目数量. [输入样例] 6 0 3 6 7 3 10 1 5 2 8 1 9 [输出样例] 4 [样例说明] 第1台录制节目1和3

USACO 2014 FEB 银组

1.自动打字{Silver题1} [问题描述] 贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息. 字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1,000,000,这些单词是无序的.现在给出N(1 <= N <= 1000)个询问,每个询问i包含一个的字符串s_i(每个字符串最多包含1000个字符)和一个整数K_i,对于所有以s_i为前缀的单词,其中按字典序排序后的第K_i个单词,求该单词在原字典里的序号. [文件输入] 第一行为两个整数W和

$[\ USACO\ 2007\ FEB\ ]\ Lilypad\ Pond\ (Silver)$

\(\\\) \(Description\) 一张\(N\times M\)的网格,已知起点和终点,其中有一些地方是落脚点,有一些地方是空地,还有一些地方是坏点. 现在要从起点到终点,每次移动走日字\((\)横一纵二或横二纵一\()\),其中只能经过起点.终点.落脚点. 现在可以开发任意个数的空地变为落脚点,问找到合法路径最少需要开发多少个空地,在满足第一个条件下最少移动多少步,在满足前两个条件下有多少条不同的路径. \(N,M\in [1,30]\) \(\\\) \(Solution\) 被

USACO 2014 JAN滑雪场建设{Gold题2}

滑雪场建设{Gold题2} [问题描述] 滑雪场的设计图是一个M*NM x N (1 <= M,N <= 100)的矩阵,每个格子里用一个字母R(表示粗糙)或者S(表示平整). 比如: RSRSSS RSRSSS RSRSSS 农民约翰的拖拉机每次可以将一块B*B (B <= M, B <= N)的区域全部标记B*B (B <= M, B <= N)的R或者S,他希望B能够尽量地大.一个格子可以被多次标记,下一次标记能够覆盖前一次标记,每个格子可以都至少被标记一次. [

USACO翻译:USACO 2014 MARCH Silver三题

USACO 2014 MARCH 一.题目概览 中文题目名称 农田灌溉 懒牛 牛叫 英文题目名称 irrigation lazy mooomoo 可执行文件名 irrigation lazy mooomoo 输入文件名 irrigation.in lazy.in mooomoo.in 输出文件名 irrigation.out lazy.out mooomoo.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方式 全文比较 全文比较 全

USACO翻译:USACO 2014 DEC Silver三题

USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 奶牛IDs 搬家 英文题目名称 piggyback cowids relocate 可执行文件名 piggyback cowids relocate 输入文件名 piggyback.in cowids.in relocate.in 输出文件名 piggyback.out cowids.out relocate.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较

USACO翻译:USACO 2012 FEB Silver三题

USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 游戏组合技 英文题目名称 planting cowids combos 可执行文件名 planting cowids combos 输入文件名 planting.in cowids.in combos.in 输出文件名 planting.out cowids.out combos.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方式 全文比较

USACO翻译:USACO 2014 JAN三题(2)

USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recording skicourse 输入文件名 bteams.in recording.in skicourse.in 输出文件名 bteams.out recording.out skicourse.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比

USACO翻译:USACO 2014 US Open 三题

USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate odometer fairphoto 输入文件名 decorate.in odometer.in fairphoto.in 输出文件名 decorate.out odometer.out fairphoto.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 1