zoukankan      html  css  js  c++  java
  • 最小距离查询


    Description

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

    InputFormat

    输入的第一行是一个正整数T (T≤20 ),表示测试数据的组数。

    每组输入数据的第一行是一个初始串S。第二行是一个正整数m (1≤m≤100000 ),表示总共操作的数量。接下来m行,每行表示一个操作。操作的格式如上所述。

    数据保证在任何情况下,S的长度不会超过100000。

    OutputFormat

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

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

    SampleOutput
    3
    -1
    2
    -1

    #include<iostream>
    #define max 100000
    using namespace std;
    
    char str[max];
    int pos[26];
    int dis[max];
    
    //每次来一个字符,
    //1)这个字符如果之前没出现过,就更新下这个字符的pos位置,然后dis表示最短距离更新为maxn
    //2)这个字符如果出现过,pos里面出现的就是离他最近的,
    //然后dis[当前节点位置] = (当前节点位置 - pos这个字符最近出现的位置)。
    //如果dis[pos这个字符最近出现的位置]<dis[当前节点位置],更新dis[pos这个字符最近出现的位置]
    
    void getdis(int cur) {
        int t = str[cur] - 'a';
        if (pos[t] == -1) {
            pos[t] = cur;
            dis[cur] = max;
        }
        else {
            dis[cur] = cur - pos[t];
            if (dis[pos[t]] > dis[cur])
                dis[pos[t]] = dis[cur];
            pos[t] = cur;
        }
    }
    
    int main() {
        int tes,len,n;
        char op[15];
        
        //输入组数
        scanf("%d", &tes);
        while (tes--) {
            scanf("%s", str);
            len = strlen(str);
            memset(pos, -1, sizeof(pos));
            for (int i = 0; i < len; i++)
                getdis(i);
    
            //输入操作数
            scanf("%d", &n);
            while (n--) {
                scanf("%s", op);
                //操作为插入
                if (strcmp(op, "INSERT") == 0) {
                    char s[2];
                    scanf("%s", s);
                    str[len] = s[0];
                    getdis(len);
                    len++;
                }
                //操作为查询最小距离
                else {
                    int x;
                    scanf("%d", &x);
                    if (dis[x] < max)
                        printf("%d
    ", dis[x]);
                    else
                        printf("-1
    ");
                }
            }
    
        }
        return 0;
    }
  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/xym4869/p/8658174.html
Copyright © 2011-2022 走看看