P2237 [USACO14FEB] Auto-complete S
题目描述
有 w w w 个由小写字符构成的字典和 n n n 个询问。每个询问由一个字符串 s s s 和一个整数 k k k 构成,求在字典序排序下字典内由 s s s 为前缀的第 k k k 字符串在输入字典的位置。若不存在,则输出 − 1 -1 −1
输入格式
第 1 1 1 行是两个整数 w w w 和 n n n
第 2 2 2 行到第 w w w + 1 1 1 行为字典中的第 i i i - 1 1 1 个,每行由字符串构成( i i i 指输入的第 i i i 行)
第 w w w + 2 2 2 行到第 w w w + n n n + 1 1 1 行由一个整数 k k k 和一个字符串 s s s 构成
输出格式
第 1 1 1 行到第 n n n 行是对于每个询问的结果,由一个整数构成
输入输出样例 #1
输入 #1
10 3
dab
ba
ab
daa
aa
aaa
aab
abc
ac
dadba
4 a
2 da
4 da
输出 #1
3
1
-1
说明/提示
对于 100 % 100\% 100% 的数据, w ≤ 30000 w \le 30000 w≤30000, 1 ≤ n ≤ 3000 1\le n \le 3000 1≤n≤3000,字典内每个字符串的长度均小于等于 1000 1000 1000,且字典的单词总长不超过 1 0 6 10 ^ 6 106。
样例解释:
对于第
1
1
1 个询问,含义为在字典中找到以 a为前缀且按字典序排序后第
4
4
4 个字符串,而字典中以 a为前缀且按字典序排序后为
{
\{
{ aa,aaa,aab,ab,abc,ac
}
\}
},第
4
4
4 个是 ab,其在输入中为第
3
3
3 个,故输出为
3
3
3
同理,对于第
2
2
2 个和第
3
3
3 个询问是在字典中找到以 da为前缀且按字典序排序后的第
2
2
2 和第
4
4
4 个字符串。而以 da为前缀的字符串按字典序排序后为
{
\{
{daa,dab,dadba
}
\}
},故第
2
2
2 个为 dab,其在输入中为第
1
1
1 个,故第
2
2
2 个输出为
1
1
1,而该序列中没有第
4
4
4 个,故第
3
3
3 个询问无解,输出
−
1
-1
−1
来源:USACO 2014 Feburary Contest Silver
翻译:@zymooll
C++实现
#include<bits/stdc++.h>
using namespace std;
pair<string ,int> a[90030];
bool match(string x,string y){
if (y.length()>x.length()) return 0;
return x.substr(0,y.size())==y;
}
int main(){
int w,n;
cin>>w>>n;
for (int i=0;i<w;i++){
cin>>a[i].first;
a[i].second=i;
}
sort(a,a+w);
while (n--){
string pre;
int k;
cin>>k>>pre;
int pos=k-1+lower_bound(a,a+w,make_pair(pre,0))-a;
if (pos>=w || !match(a[pos].first,pre)) {
cout<<"-1\n";
continue;
}
cout<<a[pos].second+1<<'\n';
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
1397

被折叠的 条评论
为什么被折叠?



