(File IO): input:auto.in output:auto.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet
题目描述
奶牛贝里斯最近有了一部新手机,于是他经常发短信。但是他经常打错单词,因为手机屏幕太小而他的爪子太大了
(
(
⊙
o
⊙
)
)
((⊙o⊙))
((⊙o⊙))。农夫约翰决定帮助贝里斯来开发一个
a
p
p
app
app应用,使得可以从一个不完整的单词猜想整个单词。
A
p
p
App
App应用是由
W
W
W个单词组成的,每个单词都是由
’
a
’
.
.
’
z
’
’a’..’z’
’a’..’z’组成的,这些单词总的长度不超过
1000000
1000000
1000000。现在,总共有N个不完整的单词,每个单词的度不超过
1000
1000
1000。对于第i个不完整的单词
S
i
S_i
Si,
a
p
p
app
app应用要计算出在单词库中,按字典序排列的第
K
i
K_i
Ki个前缀是
S
i
S_i
Si的单词。注意,自己也是自己的前缀。
输入
第一行是两个正整数
W
W
W和
N
N
N。
接下来
W
W
W行,每行一个字典库里的单词。
接下里
N
N
N行,每行一个
K
i
K_i
Ki和其对应的不完整的单词
S
i
S_i
Si。
输出
输出包括
N
N
N行,对于第i行,输出在字典库中按字典序排列的满足前缀是
S
i
S_i
Si的第
K
i
K_i
Ki个单词在原字典库中的位置。如果没有足够的单词,就输出-1。
样例输入
10 3
dab
ba
ab
daa
aa
aaa
aab
abc
ac
dadba
4 a
2 da
4 da
样例输出
3
1
-1
数据范围限制
字典库中单词的总长度不超过
1000000
,
1
<
=
N
<
=
1000
1000000,1<=N<=1000
1000000,1<=N<=1000,每个不完整的单词的长度不超过
1000
1000
1000。
W
<
=
30000
W<=30000
W<=30000
提示
前缀是
a
a
a的单词有
a
a
,
a
a
a
,
a
a
b
,
a
b
,
a
b
c
,
a
c
,
aa,aaa,aab,ab,abc,ac,
aa,aaa,aab,ab,abc,ac,第
4
4
4个是
a
b
ab
ab,
a
b
ab
ab在原字典库中是第
3
3
3个。前缀是da的单词有
d
a
a
,
d
a
b
,
d
a
d
b
a
,
daa,dab,dadba,
daa,dab,dadba,第
2
2
2个是
d
a
b
dab
dab,在原字典库中是第
1
1
1个。没有第
4
4
4个前缀是
d
a
da
da的单词,所以输出
−
1
-1
−1。
解题思路
首先一个字符串数组保存原来顺序,然后按字典序排一次序。接着找前缀为
S
i
S_i
Si的所有单词,然后进行判断,差不多就是这样吧。
Q
W
Q
QWQ
QWQ。。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m,x;
string c,cc[30010];
struct hh{
string c;
int x;
}a[30010];
bool cmp(const hh&l,const hh&r)
{
return l.c<r.c;
}
int main()
{
freopen("auto.in","r",stdin);
freopen("auto.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
cin>>a[i].c;
a[i].x=i;
}
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++)
cc[i]=a[i].c;
for (int i=1;i<=m;i++)
{
cin>>x>>c;
int l=lower_bound(cc+1,cc+n+1,c)-cc;
l=l+x-1;
if (l>n)
{
printf("-1\n");
continue;
}
if(!cc[l].find(c,0))
printf("%d\n",a[l].x);
else
printf("-1\n");
}
}