题目:小明的数字表。
题目描述
小明现在爱上了查询,他遇到了这样一个查询问题,给出 个数 ,有 个查询 ,每组查询 个数:,表示查找第 位 (个位为第1位,十位为第2位,依此类推) 为数字 的所有数字中,第 小的数,如果这个数字不存在,输出“-1”。小明不会做这个题,聪明的你可以帮助小明解决这个问题吗?
注:不考虑所有数字中的前导 。
输入格式
第一行输入一个n(n<=100000),表示数列的长度;
第二行n个正整数ai(0<=ai<=100000000);
第三行一个数字q(q<=100000)表示询问的次数;
下面q行,每行给出三个数字u,v,w,表示查找第u位为数字v的所有数字中,第w小的数。
输出格式
每个询问输出一个数字,查询不到输出“-1”。
样例
【样例输入】
4
1 21 22 3
3
2 2 2
1 1 2
2 2 3
【样例输出】
22
21
-1
【样例说明】
第2位数字为2的数字包括 (21,22) 第 2 小的数字为22;
第1位数字为1的数字包括 (1,21) 第2小的数字为21;
第2位数字为2的数字包括 (21,22) 第3小的数字不存在,输出“-1”。
数据范围与提示
n<=100000 0<=ai<=100000000 q<=100000
我的代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
vector<string> ans[13/*114514*/][11];
int n,q;
int main(){
ios::sync_with_stdio(false);
cin >> n;
for(int i=0;i<n;i++){
string s;
cin >> s;
// cout << "get s='" << s << "'.\n";
for(int j=0,len=s.length();j<len;j++){
// cout << "\nans[" << len-j << "]=" << s[len-j-1] << ".\n";
ans[len-j][s[j]-'0'].push_back(s);
}
}
for(int i=1;i<=10;i++){
for(int j=0;j<10;j++){
sort(ans[i][j].begin(),ans[i][j].end());
}
}
cin >> q;
while(q--){
int u,v,w;
cin >> u >> v >> w;
if(w>ans[u][v].size()){
cout << "-1\n";
continue;
} else{
cout << ans[u][v][w-1] << '\n';
}
}
return 0;
}
所有测试点(n大于10000)均WA。