2014北邮新生归来赛解题报告d-e

时间限制 1000 ms  内存限制 65536 KB

题目描述

给定一个由小写字母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,你需要求出相应的距离。

输入格式

输入的第一行是一个正整数 T ( T20 ),表示测试数据的组数。 每组输入数据的第一行是一个初始串S。第二行是一个正整数 m ( 1m100000 ),表示总共操作的数量。接下来m行,每行表示一个操作。操作的格式如上所述。 数据保证在任何情况下,S的长度不会超过100000。 OutputFormat 对于每个QUERY,输出所求的最小距离。如果S中其它位置都不存在和它相同的字符,输出-1。

输出格式

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

输入样例

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

输出样例

3
-1
2
-1
思路:就这么一不小心做出来了
/*
USER_ID: test#xuesu
PROBLEM: 400
SUBMISSION_TIME: 2014-07-12 15:08:38
*/
#include <cstdio>
#include <cstring>
 
using namespace std;
int c[26][100000];
int s[100000];
int len[100000];
int ps;
int p[26];
void insertchar(char ch){
    int pc=ch-'a';
    s[ps]=pc;
    c[pc][p[pc]]=ps;
    len[ps]=p[pc];
    p[pc]++;
    ps++;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        char ch;
        ps=0;
        memset(p,0,sizeof(p));
        while((ch=getchar())>'z'||ch<'a'){}
        insertchar(ch);
 
        while((ch=getchar())<='z'&&ch>='a'){
            insertchar(ch);
        }
        char op[10];
        int ct;
        scanf("%d",&ct);
        while(ct--){
        scanf("%s",op);
        if(strcmp(op,"INSERT")==0){
            while((ch=getchar())>'z'||(ch<'a')){}
            insertchar(ch);
        }
        else if(strcmp(op,"QUERY")==0){
            int x;
            scanf("%d",&x);
            int pc=s[x];
            if(p[pc]<=1)printf("-1\n");
            else {
                int len1=0x3ffffff;
                int cc=len[x];
                if(cc>0){
                    len1=x-c[pc][cc-1];
                }
                if(cc<p[pc]-1&&c[pc][cc+1]-x<len1){
                    len1=c[pc][cc+1]-x;
                }
 
                printf("%d\n",len1);
        }}
        }
    }
    return 0;
}




            while(j<ques[i].to){//后继节点满足条件
                    j++;

你可能感兴趣的:(2014北邮新生归来赛解题报告d-e)