zoukankan      html  css  js  c++  java
  • P2412 查单词

    题目背景

    滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西。

    题目描述

    udp2.T3如果遇到相同的字符串,输出后面的

    蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词(每个单词内包含大小写字母)。现在他想要找出某一段连续的单词内字典序最大的单词。

    输入输出格式

    输入格式:

    第一行包含两个正整数N、M,分别表示单词个数和询问个数。

    接下来N行每行包含一个字符串,仅包含大小写字母,长度不超过15,表示一个单词。

    再接下来M行每行包含两个整数x、y,表示求从第x到第y个单词中字典序最大的单词。

    输出格式:

    输出包含M行,每行为一个字符串,分别依次对应前面M个询问的结果。

    输入输出样例

    输入样例#1: 复制
    5 5
    absi
    hansbug
    lzn
    kkk
    yyy
    1 5
    1 1
    1 2
    2 3
    4 4
    输出样例#1: 复制
    yyy
    absi
    hansbug
    lzn
    kkk
    

    说明

    样例说明:

    第一次操作:在{absi,hansbug,lzn,kkk,yyy}中找出字典序最大的,故为yyy

    第二次操作:在{absi}中找出字典序最大的,故为absi

    第三次操作:在{absi,hansbug}中找出字典序最大的,故为hansbug

    第四次操作:在{hansbug,lzn}中找出字典序最大的,故为lzn

    第五次操作:在{kkk}中找出字典序最大的,故为kkk

    数据规模:

    注意事项:1.该题目单词字典序比对过程中大小写不敏感,但是输出必须输出原单词

    2.该题目时间限制为0.2s

    // luogu-judger-enable-o2
    //6哇
    //单词长度不超过15,我可不可以直接在树里存string?233
     
    //决定也把我的线段树写成指针 
    
    //决定以后不写 using namespace std; 
    
    //我要杀了这道题tmd
    
    //。手写比较函数不知道为啥就错了,mmp啊
    //浪费时间 
    
    //指针线段树真是吃翔了
    //made 
    
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    using std::string;
    using std::cin;
    using std::cout;
    const int N=5e4+5;
    
    int n,m;
    struct NODE
    {
        int l,r,mid;
        NODE *son[2];
        string s,maxs;
    }node[N<<2];
    struct ANS
    {
        string s,maxs;
    }ans;
    
    typedef NODE* Tree;
    Tree Root,now_node=node;
    
    inline int read()
    {
        char c=getchar();int num=0;
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar())
            num=num*10+c-'0';
        return num;
    }
    
    inline void update(Tree root)
    {
        if(root->son[0]->maxs>root->son[1]->maxs)
        {
            root->s=root->son[0]->s;
            root->maxs=root->son[0]->maxs;
        }
        else
        {
            root->s=root->son[1]->s;
            root->maxs=root->son[1]->maxs;
        }
    //    cout<<root->l<<" "<<root->r<<'
    '<<"s:  "<<root->s<<"  maxs:  "<<root->maxs<<'
    ';
    }
    
    void build(Tree &root,int l,int r)
    {
        root=++now_node;
        root->l=l,root->r=r,root->mid=l+r>>1;
        if(l==r)
        {
            cin>>root->s;
            root->maxs=root->s;
            transform(root->maxs.begin(),root->maxs.end(),root->maxs.begin(),toupper);
    //        cout<<root->s;
            return;
        }
        build(root->son[0],l,root->mid);
        build(root->son[1],root->mid+1,r);
        update(root);
    }
    
    void query(Tree root,int l,int r)
    {
        if(l==root->l&&r==root->r)
        {
            if((root->maxs)>=(ans.maxs)||ans.s=="")
            {
                ans.s=root->s;
                ans.maxs=root->maxs;
            }
            return;
        }
        if(r<=root->mid)
            query(root->son[0],l,r);
        else if(l>root->mid)
            query(root->son[1],l,r);
        else
        {
            query(root->son[0],l,root->mid);
            query(root->son[1],root->mid+1,r);
        }
    }
    
    int main()
    {
        n=read(),m=read();
        build(Root,1,n);
        for(int i=1,l,r;i<=m;++i)
        {
            l=read(),r=read();
            ans.s="",ans.maxs="";
            query(Root,l,r);
            cout<<ans.s<<'
    ';
        }
        return 0;
    }
  • 相关阅读:
    分数的加减法——C语言初学者代码中的常见错误与瑕疵(10)
    关于陈冰、陈良乔以及《我的第一本C++书》【转】
    逻辑训练与说理教育从小学开始【转】
    薛非《品悟C-抛弃C程序设计中的谬误与恶习》读后感part1【转】
    C语言初学者代码中的常见错误与瑕疵(9)
    为什么在我眼里你是一只傻逼——傻逼“常所用”句型之(1)——“就算……但是……”
    要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)
    220v转5v阻容降压电路
    IAR for stm8 memory窗口的功能
    stm8 io口重映射
  • 原文地址:https://www.cnblogs.com/lovewhy/p/8747040.html
Copyright © 2011-2022 走看看