zoukankan      html  css  js  c++  java
  • BUPT复试专题—最小距离查询(2013)

    题目描述

    给定一个由小写字母a到z组成的字符串S,其中第i个字符为S[i](下标从0开始)。你需要完成下面两个操作:
    INSERT c  其中c是一个待输入的字符。你需要在字符串的末尾添加这个字符。保证输入的字符同样是a到z之间的一个小写字母。
    QUERY x   其中x是一个输入的整数下标。对于这个询问,你需要回答在S当中和S[x]相等且与x最近的距离。输入保证x在当前字符串中合法。
    例如S = "abcaba",如果我们操作:
    INSERT a     则在S的末端加一个字符a,S变成"abcabaa"。
    接下来操作  QUERY 0
    由于S[0] = a,在S中出现的离他最近的a在下标为3的位置上,距离为3 - 0 = 3。因此应当输出3。
    接下来,如果QUERY 4    S[4] = b,S中离它最近的b出现在下标为1处,距离为4 - 1 = 3。同样应当输出3。
    给定初始字符串S和若干操作,对于每个QUERY,你需要求出相应的距离。

    HINT 由于输入数据较大,C/C++中推荐使用scanf进行读入以获得更快的读入速度。同时请注意算法复杂度。

     
     

    输入

    输入的第一行是一个正整数(),表示测试数据的组数。
    每组输入数据的第一行是一个初始串S。第二行是一个正整数(),表示总共操作的数量。接下来m行,每行表示一个操作。操作的格式如上所述。
    数据保证在任何情况下,S的长度不会超过100000。

    输出

    对于每个QUERY,输出所求的最小距离。如果S中其它位置都不存在和它相同的字符,输出-1。

     
     

    样例输入

    2
    axb
    3
    INSERT a
    QUERY 0
    QUERY 1
    explore
    3
    INSERT r
    QUERY 7
    QUERY 1

    样例输出

    3
    -1
    2
    -1

    来源

    2013机考D题 

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<map>
    #include<vector>
    #define maxn 200005
    using namespace std;
    char str[maxn];
    int main() 
    {
        int T,n;
        cin>>T;
        while(T--)
        {
            
            map<char,vector<int> > mmp;
            vector<int> vec;
            cin>>str;
            int len=strlen(str);
            for(int i=0;i<len;i++)
            {
                vec=mmp[str[i]];
                vec.push_back(i);
                mmp[str[i]]=vec;
            }
            /*map<char,vector<int> >::iterator it;//map套vector的遍历方法 
            for (it = mmp.begin(); it != mmp.end(); ++it) 
            {
                vector<int>::iterator it_inner;
                cout<<it->first<<"-> ";
                for (it_inner = it->second.begin(); it_inner != it->second.end(); ++it_inner) 
                {
                    cout << *it_inner << " ";
                }
                cout<<endl;
            }*/
            cin>>n;
            while(n--)
            {
                string donser,temp;char tp;
                cin>>donser>>temp;
                if(donser[0]=='I')
                {
                    tp=temp[0];
                    str[len+1]=str[len];
                    str[len]=tp;
                    vec=mmp[tp];
                    vec.push_back(len);
                    mmp[tp]=vec;
                    len++;
                }
                else if(donser[0]=='Q')
                {
                    int i=0;int num=temp[i]-'0';i++;
                    while(1)
                    {
                        if(i<temp.size())
                        {
                            num=num*10+(temp[i]-'0');
                            i++;
                        }
                        else 
                            break;
                    }
                    int tip=num,result_dist=23333,lable=0,temp_use=0;
                    vec=mmp[str[tip]];
                    if(vec.size()==1)
                    {
                        cout<<"-1"<<endl;
                        continue;
                    }
                    vector<int>::iterator it_inner;
                    for (it_inner = vec.begin(); it_inner != vec.end(); ++it_inner) 
                    {
                        if(tip== (*it_inner))
                        {
                            lable=1;
                            continue;
                        }
                        if(lable==0)
                        {
                            temp_use=*it_inner;
                            result_dist=tip-temp_use;
                        }
                        if(lable==1)
                        {
                            int now=*it_inner-tip;
                            if(now<result_dist)
                                result_dist=now;
                            break;
                        }
                    } 
                    cout<<result_dist<<endl;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    POJ 1830 开关问题
    UESTC 1558 Charitable Exchange
    UESTC 1546 Bracket Sequence
    POJ 2847 Widget Factory
    java实现自动登录,并获取数据
    学习JAVA浮点数必看文章!
    Linux cron 配置样例
    Red Hat 安装 Tomcat
    在RedHat Enterprise Linux 5下安装JDK
    使用seconds_behind_master和mkheartbeat 检查MySQL数据库主从延时
  • 原文地址:https://www.cnblogs.com/dzzy/p/8578671.html
Copyright © 2011-2022 走看看