(File IO): input:auto.in output:auto.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet
题目描述
奶牛贝里斯最近有了一部新手机,于是他经常发短信。但是他经常打错单词,因为手机屏幕太小而他的爪子太大了
。农夫约翰决定帮助贝里斯来开发一个
应用,使得可以从一个不完整的单词猜想整个单词。
应用是由
个单词组成的,每个单词都是由
组成的,这些单词总的长度不超过
。现在,总共有N个不完整的单词,每个单词的度不超过
。对于第i个不完整的单词
,
应用要计算出在单词库中,按字典序排列的第
个前缀是
的单词。注意,自己也是自己的前缀。
输入
第一行是两个正整数
和
。
接下来
行,每行一个字典库里的单词。
接下里
行,每行一个
和其对应的不完整的单词
。
输出
输出包括
行,对于第i行,输出在字典库中按字典序排列的满足前缀是
的第
个单词在原字典库中的位置。如果没有足够的单词,就输出-1。
样例输入
10 3
dab
ba
ab
daa
aa
aaa
aab
abc
ac
dadba
4 a
2 da
4 da
样例输出
3
1
-1
数据范围限制
字典库中单词的总长度不超过
,每个不完整的单词的长度不超过
。
提示
前缀是
的单词有
第
个是
,
在原字典库中是第
个。前缀是da的单词有
第
个是
,在原字典库中是第
个。没有第
个前缀是
的单词,所以输出
。
解题思路
首先一个字符串数组保存原来顺序,然后按字典序排一次序。接着找前缀为
的所有单词,然后进行判断,差不多就是这样吧。
。。
代码
#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");
}
}