题目链接: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; }
原文:https://www.cnblogs.com/SJCHEN/p/10637843.html