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
来源
#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=;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[]=='I')
{
tp=temp[];
str[len+]=str[len];
str[len]=tp;
vec=mmp[tp];
vec.push_back(len);
mmp[tp]=vec;
len++;
}
else if(donser[]=='Q')
{
int i=;int num=temp[i]-'';i++;
while()
{
if(i<temp.size())
{
num=num*+(temp[i]-'');
i++;
}
else
break;
}
int tip=num,result_dist=,lable=,temp_use=;
vec=mmp[str[tip]];
if(vec.size()==)
{
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=;
continue;
}
if(lable==)
{
temp_use=*it_inner;
result_dist=tip-temp_use;
}
if(lable==)
{
int now=*it_inner-tip;
if(now<result_dist)
result_dist=now;
break;
}
}
cout<<result_dist<<endl;
}
}
}
return ;
}
BUPT复试专题—最小距离查询(2013)的更多相关文章
- BUPT复试专题—字符串转换(2013计院)
题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串.现在给你一个仅由小写字母组成的字符串, ...
- BUPT复试专题—统计时间间隔(2013计院)
题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...
- BUPT复试专题—中序遍历序列(2013)
题目描述 给出一个序列,判断该序列是不是某二叉搜索树的中序遍历序列,如果是输出"Yes",否则输出"No".一颗带权二叉树是一颗二叉搜索树(二叉排序树),当且仅 ...
- BUPT复试专题—统计节点个数(2013)
题目描述 给出一棵有向树,一共有n个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数. 如样例,第一 ...
- BUPT复试专题—日期(2013)
题目描述 请你计算出第年月日是第X年的第几天.其中,1月1日是第一天,1月2日是第二天,以此类推. 计算时请注意闰年的影响.对于非整百年,年数能整除4是闰年,否则不是闰年:对于整百年,年数能整除400 ...
- BUPT复试专题—最值问题(2013计院)
题目描述 给出N个数,求出这N个数中最大值和次大值.注意这里的次大值必须严格小于最大值.输入保证N个数中至少存在两个不同的数. 输入格式 第一行为测试数据的组数T(T≤20).请注意,任意两组测试数据 ...
- BUPT复试专题—数据库检索(2014软院)
题目描述 在数据库的操作过程中,我们进场会遇到检索操作.这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果. 我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex) ...
- BUPT复试专题—最近公共祖先(2014软院)
题目描述 给出一棵有N个节点的有根树TREE(根的编号为1),对于每组查询,请输出树上节点u和v的最近公共祖先. 最近公共祖先:对于有向树TREE的两个结点u,v.最近公共祖先LCA(TREE u,v ...
- BUPT复试专题—进程管理(2014网研)
题目描述 在操作系统中,进程管理是非常重要的工作.每个进程都有唯一的进程标识PID.每个进程都可以启动子进程,此时我们称该它本身是其子进程的父进程.除PID为0的进程之外,每个进程冇且只冇一个父进程. ...
随机推荐
- js函数arguments与获取css样式方法
函数传参,当参数的个数不定时,可以使用arguments:表示实参集合 arguments.length=实参个数 获得css样式方法: getComputedStyle()方法---->得到的 ...
- fshc之请求仲裁机制(from mcu and cache)
1.arbiter模块本身放在sclk时钟域,但是输入都是来之HCLK时钟域. 2.当MCU/CACHE访问FSHC时,FSHC不接受其他请求,FSHC只可以同时处理一个请求的操作. 3.如果原子操作 ...
- cache支持single/increment/increment4三种方式传输
1.cache bypass signle---data length 已知 increment ---data length 不知 用 last data address 结束数据传输 2.cac ...
- laravel中migrate的使用
migration的使用是大大提高了我们开发的效率,数据库迁移大大的方便了我们.今天我就来给大家分享下migration 首先: laravel提供了我们一些基本的建表的规范: 表名:通常用名词+s的 ...
- 【php】 PHP 支持 9 种原始数据类型
PHP 支持 9 种原始数据类型. 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string(字符串) 三种复合类型: array(数 ...
- logging日志模块,四种方式
1.最简单的用法 import logging logging.error("hah") logging.info("hah") logging.debug(& ...
- shell-code-3-echo用法&printf用法
××××××××××××××××××××××××××××××下面是echo××××××××××××××××××××××××××××××× # read 命令从标准输入(即执行时,键盘的输入)中读取一行 ...
- PC上测试移动端网站和模拟手机浏览器
一.Chrome*浏览器 chrome模拟手机总共有四种方法,原理都一样,通过伪装User-Agent,将浏览器模拟成Android设备.以下标星的为推荐方法. 1.新建Chrome快捷方式 右击桌面 ...
- strcat strcpy 源代码,用指针去实现
15. 指针实现 strcmp函数 • int newStrcpy(char *p, char *q) • { • while(*p ==*q) { ...
- idea中代码费格式化 ctrl+alt+L
idea中代码费格式化 ctrl+alt+L