题目大意:
奶牛贝里斯最近有了一部新手机,于是他经常发短信。但是他经常打错单词,因为手机屏幕太小而他的爪子太大了((⊙o⊙))。农夫约翰决定帮助贝里斯来开发一个app应用,使得可以从一个不完整的单词猜想整个单词。 App应用是由W个单词组成的,每个单词都是由’a’..’z’组成的,这些单词总的长度不超过1000000。现在,总共有N个不完整的单词,每个单词的度不超过1000。对于第i个不完整的单词S_i,app应用要计算出在单词库中,按字典序排列的第K_i个前缀是S_i的单词。注意,自己也是自己的前缀。 输入 第一行是两个正整数W和N。 接下来W行,每行一个字典库里的单词。 接下里N行,每行一个K_i和其对应的不完整的单词S_i。 输出 输出包括N行,对于第i行,输出在字典库中按字典序排列的满足前缀是S_i的第K_i个单词在原字典库中的位置。如果没有足够的单词,就输出-1。
样例输入 10 3 dab ba ab daa aa aaa aab abc ac dadba 4 a 2 da 4 da
数据范围限制
【数据规模】 字典库中单词的总长度不超过1000000,1<=N<=1000,每个不完整的单词的长度不超过1000。 W<=30000 提示
【样例说明】 前缀是a的单词有aa,aaa,aab,ab,abc,ac,第4个是ab,ab在原字典库中是第3个。前缀是da的单词有daa,dab,dadba,第2个是dab,在原字典库中是第1个。没有第4个前缀是da的单词,所以输出-1。
解题思路 :
首先一个字符串数组保存原来顺序,然后按字典序排一次序。接着找前缀为S_i的所有单词————然后进行判断,差不多就这样吧———— ———-
源程序:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define r(i,a,b) for (int i=a;i<=b;i++)
using namespace std; int w,n,k;
struct node
{
int x;
string s;
}c[30001];
string e,cc[30001];
bool cmp(node xx,node yy) { return xx.s<yy.s; }
int main()
{
//freopen("auto.in","r",stdin);
//freopen("auto.out","w",stdout);
scanf("%d%d",&w,&n);
r(i,1,w)
{ cin>>c[i].s; c[i].x=i; }
sort(c+1,c+w+1,cmp);
r(i,1,w) cc[i]=c[i].s; //多用一个字符串数组保存
r(i,1,n)
{
cin>>k>>e;
int u=lower_bound(cc+1,cc+w+1,e)-cc; //第一个含有e这个子串的在字符串里面的位置 u=u+k-l; if (u>w) {puts("-1"); continue;}//如果u超过了单词库里单词的数量直接输出-1就好
if (!cc[u].find(e,0)) printf("%d\n",c[u].x);
else puts("-1"); //如果e在当前字符串的位置是零那么就输出,否则还是输出-1
}
}