Submission #20387807


Source Code Expand

#include <bits/stdc++.h>
typedef long long lint;
using namespace std;

string s;

char seed(int x) {
    if (s[x] == s[x + 1] && s[x] != s[x + 2]) {
        return s[x];
    } else {
        return 'X';
    }
}

// 累積和
struct cumulative_sum {
    using lint = long long int;
    int sz;
    // data[i]:元の数列
    vector<lint> data;
    // cum[i]:[0,i)の和
    vector<lint> sum;
    // 要素数を指定して初期化
    cumulative_sum(const int _sz) : sz(_sz) {
        data.assign(sz, 0);
        sum.assign(sz + 1, 0);
    }
    lint& operator[](const int k) {
        return data[k];
    }
    // dataに基づいてsumを構築
    void build() {
        for (int i = 0; i < sz; i++) sum[i + 1] = sum[i] + data[i];
    }
    // [a,b)の和を求める
    lint query(const int a, const int b) {
        return sum[b] - sum[a];
    }
};

vector<cumulative_sum> counts() {
    lint n = s.length();
    vector<cumulative_sum> res(26, cumulative_sum(n));
    for (int i = 0; i < n; i++) {
        int c = s[i] - 'a';
        res[c][i] = 1;
    }
    for (int i = 0; i < 26; i++) {
        res[i].build();
    }
    return res;
}

int main() {
    cin >> s;
    int n = s.length();
    char before_c = 'Y';
    int before_i = n;
    lint ans = 0;
    auto cum = counts();
    for (int i = n - 3; i >= 0; i--) {
        char c = seed(i);
        if (c == 'X') {
            continue;
        }
        if (c != before_c) {
            ans += n - (i + 2) - cum[c - 'a'].query(i + 2, before_i);
        } else {
            ans += before_i - (i + 2) - cum[c - 'a'].query(i + 2, before_i);
        }
        before_c = c;
        before_i = i;
    }
    cout << ans << endl;
}

Submission Info

Submission Time
Task C - String Invasion
User mijinko
Language C++ (GCC 9.2.1)
Score 500
Code Size 1762 Byte
Status AC
Exec Time 79 ms
Memory 88140 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 3
AC × 25
Set Name Test Cases
Sample s1.txt, s2.txt, s3.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, s1.txt, s2.txt, s3.txt
Case Name Status Exec Time Memory
01.txt AC 79 ms 87936 KiB
02.txt AC 76 ms 87996 KiB
03.txt AC 76 ms 87940 KiB
04.txt AC 75 ms 88136 KiB
05.txt AC 74 ms 88140 KiB
06.txt AC 75 ms 88140 KiB
07.txt AC 76 ms 88040 KiB
08.txt AC 75 ms 87940 KiB
09.txt AC 77 ms 88012 KiB
10.txt AC 75 ms 88048 KiB
11.txt AC 73 ms 87912 KiB
12.txt AC 75 ms 87940 KiB
13.txt AC 76 ms 87912 KiB
14.txt AC 73 ms 87940 KiB
15.txt AC 73 ms 87908 KiB
16.txt AC 72 ms 88080 KiB
17.txt AC 74 ms 88008 KiB
18.txt AC 71 ms 88008 KiB
19.txt AC 2 ms 3472 KiB
20.txt AC 2 ms 3628 KiB
21.txt AC 3 ms 3600 KiB
22.txt AC 3 ms 3604 KiB
s1.txt AC 2 ms 3560 KiB
s2.txt AC 2 ms 3504 KiB
s3.txt AC 2 ms 3452 KiB