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。
每组输入数据的第一行是一个初始串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
来源
#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; }