传统弱校HFUT的蒟蒻,真相只有一个

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;
}

 

posted @ 2018-03-16 09:48  未名亚柳  阅读(247)  评论(0编辑  收藏  举报