洛谷[P2412] 查单词

人生苦短,我用map

话说那些码线段树的都是大佬%%%%%%
本蒟蒻不会,于是就用了两个map+cincout,开O2O_2O2才过,但我没优化常数,优化常数的话肯定是能过的。
为什么用O2O_2O2?
map常数贼大.....
我们用一个map存他的初始位置,一个存更改大小写以后的字符串(然而用结构体肯定更好,然而我懒,就用map了)

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d;
string s[50002],s3[50002];
map<string,int>mmp;
map<string ,string>mmq;     //两个map,但实际上你也可以用结构体存改了大写以后的,都差不多
bool cmp(string s1,string s2){return s1>s2;}//反向sort必备
int main(){
    ios::sync_with_stdio(false);
    cin>>a>>b;         //就是喜欢用cin
    for(int i=1;i<=a;i++)
        cin>>s[i],mmp[s[i]]=i;  //存初始位置
    for(int i=1;i<=a;i++){
        string s4=s[i];
        for(int j=0;j<s4.size();j++){
            if(s4[j]>='A'&&s4[j]<='Z')
                s3[i]+='a'+s4[j]-'A'; 
            else s3[i]+=s4[j];
        }
        mmq[s3[i]]=s4;
    }            //更改那些大写的字母
    sort(s3+1,s3+a+1,cmp);
    for(int i=1;i<=b;i++){
        cin>>c>>d;
        for(int j=1;j<=a;j++)
            if(mmp[mmq[s3[j]]]>=c&&mmp[mmq[s3[j]]]<=d){
                cout<<mmq[s3[j]]<<'\n';break;}      //这才是主程序,前面都是预处理
    }
} 

 

 

人生苦短,我用STl

posted @ 2018-10-23 20:18  Viston  阅读(148)  评论(0)    收藏  举报