zoukankan      html  css  js  c++  java
  • Long Long Ago 二分查找

    L: Long Long Ago

    时间限制: 1 s      内存限制: 128 MB     

    提交 我的状态

    题目描述

    今天SHIELD捕获到一段从敌方基地发出的信息里面包含一串被经过某种算法加密过的的序列L
    组织的间谍活动如下几个线索:
    这个算法不会改变秘密消息的字符顺序,但是会两个字符之间在中间加入未知个数的字符
    如原信息
    ab
    可能的加密结果
    ammmxxxxb
    现在你有n个待选关键字
    如果这个关键字可能是秘密消息输出Yes,否则输出No
    如ammmmxxxxb
    可能包含的关键字有
    ab
    mb
    mxb
    ......

    输入

    第一行输入一串字符串LL(1≤L≤105)(1≤L≤105)
    第二行输入一个整数NN,表示查找字符串的个数。(1≤N≤105)(1≤N≤105)
    接下来NN行表示,输入一行字符串MM  n个字符的长度之和为[1,100000]

    输出

    输出NN行,如果是符合提议就输出Yes,否则输出No

    样例输入

    noiauwfaurainairtqltqlmomomo
    8
    rain
    air
    tql
    ntt
    xiaobai
    oiiiooo
    orzcnzcnznb
    ooooo
    

    样例输出

    Yes
    Yes
    Yes
    Yes
    No
    Yes
    No
    No

    题解:题目意思是若询问的字符串是原字符串切割出来的,输出Yes,否则输出No,用map记录(我用的是字符与a的差值作为下标)每个字符对应的所有位置,然后每输入一串字符就遍历一次该字符串的所有字母,对于每一个字符二分查找出大于前一个字符所取位置的第一个位置,若未找到则退出遍历,输出No;

    #include<iostream>
    #include<string.h>
    #include<vector>
    using namespace std;
    #define ll long long
    char s[1000011],ss[1000011];
    vector<ll>p[33];
    ll sort2(ll i,ll k){
            if(p[i].size()==0)
                    return -1;
            ll x=0,y=p[i].size()-1;
            while(x<=y){
                    ll m=x+(y-x>>1);
                    if(p[i][m]>k)
                            y=m-1;
                    else
                            x=m+1;
            }
            return x<p[i].size()?p[i][x]:-1;
    }
    int main(){
            scanf("%s",s);
            for(int i=0;s[i];i++)
                    p[s[i]-'a'].push_back(i);
            // for(int i=0;i<26;i++)
            //         for(int j=0;j<p[i].size();j++)
            //                 cout<<p[i][j]<<endl;
            ll n,k;
            scanf("%lld",&n);
            while(n--){
                    scanf("%s",ss);
                    ll len=strlen(ss)-1;
                    bool flag=0;
                    k=-1;
                    for(int i=0;ss[i];i++){
                            k=sort2(ss[i]-'a',k);//二分查找大于k的第一个数
                            if(k==-1)
                                    {flag=1;break;}
                    }
                    if(!flag)
                            printf("Yes
    ");
                    else
                            printf("No
    " );
            }
            return 0;
    }
    
  • 相关阅读:
    消息(5)——WSE增强的web服务套件,MTOM附件
    消息(4)——WS附件传输,包体中的base64编码附件
    WCF消息之XmlDictionaryWriter
    Aptana使用技巧—Aptana2.0系列教程
    [f]获取URL中的参数[转]
    [f]获取元素在页面的位置getPos
    手机wap2.0网页缩放设置
    WPF SnapsToDevicePixels作用
    Silverlight获取控件绝对位置
    浏览器: F5 和 Ctrl+F5的区别
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10704471.html
Copyright © 2011-2022 走看看