• 【洛谷 2412】查单词


    题目背景

    滚粗了的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

    题解:这个线段树没有被卡啊……很奇怪为什么那么多人被卡

                其实不难(如果我没提交10几次我可能会说简单……)

               线段树返回不是最大值而是返回编号,就酱。

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<bits/stdc++.h>
    using namespace std;
    const int N=50002;
    struct node{
        string yy;
        string s;
        int id;
    }e[N];
    int mx[N*4],x,y;
    int n,m,a[N];
    int maxx(int x,int y){
        if(e[x].s>e[y].s) return x;
        else return y;
    }
    void pushup(int rt)
        { mx[rt]=maxx(mx[rt*2],mx[rt*2+1]); }
    
    void build(int l,int r,int rt){
        if(l==r) {
            mx[rt]=l;
            return ;
        }
        int m=(l+r)/2;
        build(l,m,rt*2);
        build(m+1,r,rt*2+1);
        pushup(rt);
    }
    int query(int L,int R,int l,int r,int rt){
        if(r<L || l>R) return 0;
        if(L<=l && R>=r) return mx[rt];
        int m=(l+r)/2,ans=0;
        if(L<=m) ans=maxx(ans,query(L,R,l,m,rt*2));
        if(R>m)  ans=maxx(ans,query(L,R,m+1,r,rt*2+1));
        return ans;
    }
    int main(){
        freopen("2412.in","r",stdin);
        freopen("2412.out","w",stdout);
        cin>>n>>m; 
        scanf("
    "); //scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++) {
            getline(cin,e[i].s);
            e[i].yy=e[i].s;
            int len=e[i].s.size();
            for(int j=0;j<len;j++){
                if(e[i].s[j]<='Z' && e[i].s[j]>='A') 
                   e[i].s[j]+=('a'-'A'); 
            }
        }
            
        build(1,n,1);
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            //cout<<x<<y<<endl;
            if(x==y) { cout<<e[x].yy<<endl; continue; }
            int z=query(x,y,1,n,1);
            cout<<e[z].yy<<endl;
            //cout<<e[i].s<<endl;
        }
        
        return 0;
    }
  • 相关阅读:
    获取html
    asp.net上传图片自动生成缩略图功能代码
    又发现了一个好东西zTree,KindEditor,Kissy Editor,脚本安全类工具Burp suite
    C#.Net网络程序开发Socket篇
    简单验证码的制作
    C#:文件创建、复制、移动、删除
    日常提醒2 (delphi源码)
    time_t和SYSTEMTIME 与TDateTime的转换 (转)
    简单的图片对比函数
    胃总是涨 大便不成形 打嗝 口有异味?
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11855047.html
Copyright © 2020-2023  润新知