道路阻塞

题目大意:

奶牛贝里斯最近有了一部新手机,于是他经常发短信。但是他经常打错单词,因为手机屏幕太小而他的爪子太大了((⊙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
    } 
} 
END.
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值