• 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;
    }
    
  • 相关阅读:
    IntelliJ IDEA插件-常用插件
    Java代码规范和质量检查插件-Checkstyle(官方资源)
    Google代码风格配置文件(Java)(IDEA/Eclipse)
    Java中常量定义在interface和class的区别(转)
    Mac下安装Iterm2终端工具
    Ubuntu 16.04安装IntelliJ出品的数据库管理工具DataGrip
    Ubuntu 16.04安装JAD反编译工具(Java)
    Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别
    微信开发(一)基于Wx-java的微信分享功能
    spring@value取不到值的几种情况
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10704471.html
Copyright © 2020-2023  润新知