题目描述

给定一个由小写字母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。

 
 

样例输入

  1. 2
  2. axb
  3. 3
  4. INSERT a
  5. QUERY 0
  6. QUERY 1
  7. explore
  8. 3
  9. INSERT r
  10. QUERY 7
  11. QUERY 1

样例输出

  1. 3
  2. -1
  3. 2
  4. -1

来源

2013机考D题

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<string>
  5. #include<cstring>
  6. #include<map>
  7. #include<vector>
  8. #define maxn 200005
  9. using namespace std;
  10. char str[maxn];
  11. int main()
  12. {
  13. int T,n;
  14. cin>>T;
  15. while(T--)
  16. {
  17.  
  18. map<char,vector<int> > mmp;
  19. vector<int> vec;
  20. cin>>str;
  21. int len=strlen(str);
  22. for(int i=;i<len;i++)
  23. {
  24. vec=mmp[str[i]];
  25. vec.push_back(i);
  26. mmp[str[i]]=vec;
  27. }
  28. /*map<char,vector<int> >::iterator it;//map套vector的遍历方法
  29. for (it = mmp.begin(); it != mmp.end(); ++it)
  30. {
  31. vector<int>::iterator it_inner;
  32. cout<<it->first<<"-> ";
  33. for (it_inner = it->second.begin(); it_inner != it->second.end(); ++it_inner)
  34. {
  35. cout << *it_inner << " ";
  36. }
  37. cout<<endl;
  38. }*/
  39. cin>>n;
  40. while(n--)
  41. {
  42. string donser,temp;char tp;
  43. cin>>donser>>temp;
  44. if(donser[]=='I')
  45. {
  46. tp=temp[];
  47. str[len+]=str[len];
  48. str[len]=tp;
  49. vec=mmp[tp];
  50. vec.push_back(len);
  51. mmp[tp]=vec;
  52. len++;
  53. }
  54. else if(donser[]=='Q')
  55. {
  56. int i=;int num=temp[i]-'';i++;
  57. while()
  58. {
  59. if(i<temp.size())
  60. {
  61. num=num*+(temp[i]-'');
  62. i++;
  63. }
  64. else
  65. break;
  66. }
  67. int tip=num,result_dist=,lable=,temp_use=;
  68. vec=mmp[str[tip]];
  69. if(vec.size()==)
  70. {
  71. cout<<"-1"<<endl;
  72. continue;
  73. }
  74. vector<int>::iterator it_inner;
  75. for (it_inner = vec.begin(); it_inner != vec.end(); ++it_inner)
  76. {
  77. if(tip== (*it_inner))
  78. {
  79. lable=;
  80. continue;
  81. }
  82. if(lable==)
  83. {
  84. temp_use=*it_inner;
  85. result_dist=tip-temp_use;
  86. }
  87. if(lable==)
  88. {
  89. int now=*it_inner-tip;
  90. if(now<result_dist)
  91. result_dist=now;
  92. break;
  93. }
  94. }
  95. cout<<result_dist<<endl;
  96. }
  97. }
  98. }
  99. return ;
  100. }

BUPT复试专题—最小距离查询(2013)的更多相关文章

  1. BUPT复试专题—字符串转换(2013计院)

    题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串.现在给你一个仅由小写字母组成的字符串, ...

  2. BUPT复试专题—统计时间间隔(2013计院)

    题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...

  3. BUPT复试专题—中序遍历序列(2013)

    题目描述 给出一个序列,判断该序列是不是某二叉搜索树的中序遍历序列,如果是输出"Yes",否则输出"No".一颗带权二叉树是一颗二叉搜索树(二叉排序树),当且仅 ...

  4. BUPT复试专题—统计节点个数(2013)

    题目描述 给出一棵有向树,一共有n个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数. 如样例,第一 ...

  5. BUPT复试专题—日期(2013)

    题目描述 请你计算出第年月日是第X年的第几天.其中,1月1日是第一天,1月2日是第二天,以此类推. 计算时请注意闰年的影响.对于非整百年,年数能整除4是闰年,否则不是闰年:对于整百年,年数能整除400 ...

  6. BUPT复试专题—最值问题(2013计院)

    题目描述 给出N个数,求出这N个数中最大值和次大值.注意这里的次大值必须严格小于最大值.输入保证N个数中至少存在两个不同的数. 输入格式 第一行为测试数据的组数T(T≤20).请注意,任意两组测试数据 ...

  7. BUPT复试专题—数据库检索(2014软院)

    题目描述 在数据库的操作过程中,我们进场会遇到检索操作.这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果. 我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex) ...

  8. BUPT复试专题—最近公共祖先(2014软院)

    题目描述 给出一棵有N个节点的有根树TREE(根的编号为1),对于每组查询,请输出树上节点u和v的最近公共祖先. 最近公共祖先:对于有向树TREE的两个结点u,v.最近公共祖先LCA(TREE u,v ...

  9. BUPT复试专题—进程管理(2014网研)

    题目描述 在操作系统中,进程管理是非常重要的工作.每个进程都有唯一的进程标识PID.每个进程都可以启动子进程,此时我们称该它本身是其子进程的父进程.除PID为0的进程之外,每个进程冇且只冇一个父进程. ...

随机推荐

  1. 什么是php?php的优缺点有哪些?与其它编程语言的优缺点?

    身为一个PHP开发者,有必要了解一下PHP的缺点,知道每种语言的优点和缺点,才能知道某种语言在什么场景下适合使用,在什么场景下不适合使用. 这个问题我曾经面试的时候遇到过,我之前没总结过,第一问大部分 ...

  2. Linux实现删除撤回的方法。

    RM命令改造 vim /etc/bashrc   在文件的最前端添加如下代码   #修改rm命令 alias rm=delete  #命令别名,通过delete来实现rm改为mv alias r=de ...

  3. Python包,json&pickle,time&datetime,random模块

    补充内容: 解决模块循环导入的两种方法:(不得已而为之,表示程序结构不够严谨) 将导入模块语句放在文件最下方 保证语句导入之前函数内代码能够被执行 将导入语句放进函数体内 使其不影响整个函数的运行 包 ...

  4. Python9-day11-作业

    # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),# 要求登录成功一次,后续的函数都无需再输入用户名和密码 FLAG = False def login(func): def ...

  5. Python9-day2 作业

    下列结果是什么? 6 or 2 >1     6 3 or 2 > 1  3 0 or 5<4  false 5 < 4 or 3  3 2 >1 or 6 True 3 ...

  6. 经典DP问题--poj1088滑雪

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  7. 算法学习记录-图(DFS BFS)

    图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...

  8. 03007_HttpServlet

    1.创建 new---Servlet package com.gzdlh.servlet; import java.io.IOException; import javax.servlet.Servl ...

  9. luogu1345 [USACO5.4]奶牛的电信Telecowmunication

    对于每个点,把它拆成有权值为1的边相连的两个点,原边是inf. 边的起点统一加n,ss也加n 这就成了最小割 #include <iostream> #include <cstrin ...

  10. lnmp环境的使用

    lnmp环境的使用 安装的软件都安装到了:/usr/local 管理nginx service nginx start|stop|restart|reload 管理mysql 直接执行mysql即可登 ...