K – Summer Trip Kattis – summertrip

  • Post author:
  • Post category:其他




Summer Trip Kattis – summertrip


vj题目传送门


思路:遍历字符串,更新每一个字母最新出现的位置vis,从之后走过的位置更新st(set数组),记录在这个字母两次出现的区间中,其他字母是否出现过,没出现过就使结果加一,并添加在st数组中;若最外层遍历中,字母再次出现则清空st对应字母的数组重新添加字母,以此来计算结果总数。

题解:

#include <bits/stdc++.h>
using namespace std;
#define ll long long

const int maxn = 1e5+7;
set<int> st[29];
bool vis[29];
char str[maxn];
int ans;

int main() {
    scanf("%s", str);
    int len = strlen(str);
    for(int i=0; i<len; i ++ ){
        int t = str[i] - 'a' + 1;
        if(vis[t]) st[t].clear();
        for(int j=1; j<=26; j++){
            if(j == t) continue;
            if(vis[j]){
                if(st[j].count(t))
                    continue;
                st[j].insert(t);
                ans ++;
             }
        }
        vis[t] = true;
    }
    printf("%d\n", ans);
    return 0;
 }

                          



版权声明:本文为weixin_45301032原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。