E. Mo的游戏

题目链接:https://www.hpuoj.com/contest/16/problem/E/

这题也是模拟,只要注意第一次出现的位置,然后后面再出现比它距离更短的就更新

这里我们先把距离设置为INF,

//
//  main.cpp
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
#define ll long long
const int INF=0x3f3f3f3f;
int res[100000];
int pos[100000];
char s[1000000];

int main()
{
    memset(pos,-1,sizeof(pos));
    memset(res,INF,sizeof(res));
    cin >> s;
    int len = strlen(s);
    map<char,int>mp;
    for (int i=0; i<len; i++) {
        mp[s[i]]++;
        if (pos[s[i]] >= 0) {
            res[s[i]] = min(i-pos[s[i]],res[s[i]]);
        }
        pos[s[i]] = i;
    }
    for (char i='a'; i<='z'; i++) {
        if (mp[i]) {
            printf("%c:",i);
            if (res[i] != INF) printf("%d",len-res[i]);
            else printf("0");
            printf("\n");
        }
    }
    for (char i='A'; i<='Z'; i++) {
        if (mp[i]) {
            printf("%c:",i);
            if (res[i] != INF) printf("%d",len-res[i]);
            else printf("0");
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SJCHEN/p/10637843.html