Submission details
Task:Merkkijonot
Sender:Metabolix
Submission time:2025-11-13 19:24:18 +0200
Language:C++ (C++20)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED18
#2ACCEPTED19
#3ACCEPTED20
#4ACCEPTED21
#5ACCEPTED22
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3, 4, 5details
#2ACCEPTED0.00 s2, 3, 4, 5details
#3ACCEPTED0.00 s1, 2, 3, 4, 5details
#4ACCEPTED0.00 s1, 2, 3, 4, 5details
#5ACCEPTED0.00 s1, 2, 3, 4, 5details
#6ACCEPTED0.01 s1, 2, 3, 4, 5details
#7ACCEPTED0.00 s1, 2, 3, 4, 5details
#8ACCEPTED0.00 s1, 2, 3, 4, 5details
#9ACCEPTED0.00 s1, 2, 3, 4, 5details
#10ACCEPTED0.00 s1, 2, 3, 4, 5details
#11ACCEPTED0.00 s2, 3, 4, 5details
#12ACCEPTED0.01 s2, 3, 4, 5details
#13ACCEPTED0.03 s2, 3, 4, 5details
#14ACCEPTED0.03 s2, 3, 4, 5details
#15ACCEPTED0.00 s2, 3, 4, 5details
#16ACCEPTED0.01 s2, 3, 4, 5details
#17ACCEPTED0.01 s2, 3, 4, 5details
#18ACCEPTED0.01 s2, 3, 4, 5details
#19ACCEPTED0.00 s3, 4, 5details
#20ACCEPTED0.06 s3, 4, 5details
#21ACCEPTED0.08 s3, 4, 5details
#22ACCEPTED0.07 s3, 4, 5details
#23ACCEPTED0.00 s3, 4, 5details
#24ACCEPTED0.10 s3, 4, 5details
#25ACCEPTED0.01 s3, 4, 5details
#26ACCEPTED0.02 s3, 4, 5details
#27ACCEPTED0.00 s4, 5details
#28ACCEPTED0.10 s4, 5details
#29ACCEPTED0.33 s4, 5details
#30ACCEPTED0.23 s4, 5details
#31ACCEPTED0.00 s4, 5details
#32ACCEPTED0.37 s4, 5details
#33ACCEPTED0.02 s4, 5details
#34ACCEPTED0.07 s4, 5details
#35ACCEPTED0.00 s5details
#36ACCEPTED0.18 s5details
#37ACCEPTED0.47 s5details
#38ACCEPTED0.39 s5details
#39ACCEPTED0.00 s5details
#40ACCEPTED0.64 s5details
#41ACCEPTED0.03 s5details
#42ACCEPTED0.11 s5details

Code

#include <bits/stdc++.h>

using namespace std;

const long MOD = 1'000'000'007;

int n, m;
string s;

typedef unordered_map<uint64_t, uint64_t> määrät_t;
typedef unordered_map<uint64_t, määrät_t> kaaret_t;
kaaret_t kaaret;

void luo_kaaret(uint64_t tila) {
    if (kaaret.count(tila)) {
        return;
    }
    for (char c = 'a'; c <= 'z'; ++c) {
        uint64_t uusi_tila = 0;
        if ((s[0] == c)) {
            uusi_tila |= (1ULL << 0);
        }
        for (int i = 0; i < m-1; ++i) {
            if (((tila >> i) & 1) && s[i + 1] == c) {
                uusi_tila |= (1ULL << (i + 1));
            }
        }
        if ((tila >> (m-1)) & 1) {
            for (int i = 0; i < m; ++i) {
                if (s[i] == c) {
                    uusi_tila |= (1ULL << i);
                }
            }
        }
        if (uusi_tila) {
            kaaret[tila][uusi_tila] += 1;
            if (kaaret[tila][uusi_tila] > 1) {
                cerr << "varoitus: moninkertainen kaari tilasta " << tila << " tilaan " << uusi_tila << "\n";
            }
            luo_kaaret(uusi_tila);
        }
    }
}

int main() {
    cin >> n >> m;
    cin >> s;

    luo_kaaret(1ULL << 0);

    määrät_t tulos;
    tulos[1ULL << 0] = 1;
    n -= 1; // lähtömerkki on jo asetettu

    while (n) {
        // Jos tämä bitti kuuluu summaan, edetään näitä kaaria
        if (n & 1) {
            n -= 1;
            määrät_t seuraava;
            for (auto& [tila0, määrä0] : tulos) {
                for (auto& [tila1, määrä01] : kaaret[tila0]) {
                    auto& x = seuraava[tila1];
                    x += määrä0 * määrä01;
                    x %= MOD;
                }
            }
            tulos = move(seuraava);
        }
        // Kerrotaan kaaren pituus kahdella
        if (n) {
            n >>= 1;
            kaaret_t kaksoiskaaret;
            for (auto& [tila0, mappi] : kaaret) {
                for (auto& [tila1, määrä01] : mappi) {
                    for (auto& [tila2, määrä12] : kaaret[tila1]) {
                        auto& x = kaksoiskaaret[tila0][tila2];
                        x += määrä01 * määrä12;
                        x %= MOD;
                    }
                }
            }
            kaaret = move(kaksoiskaaret);
        }
    }

    // Voittotilat ovat ne, joissa leima päättyy
    long vastaus = 0;
    for (auto& [tila, määrä] : tulos) {
        if (tila & (1ULL << (m - 1))) {
            vastaus += määrä;
            if (vastaus > MOD) {
                vastaus %= MOD;
            }
        }
    }
    cout << vastaus << "\n";
    return 0;
}

Test details

Test 1

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
1 1
a

correct output
1

user output
1

Test 2

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
20 20
ssxfykmuzljmwgyvldnu

correct output
1

user output
1

Test 3

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aaaaaaaaaa

correct output
1

user output
1

Test 4

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aabbbaaaab

correct output
1532

user output
1532

Test 5

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aabbacbdca

correct output
1542

user output
1542

Test 6

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
ztknszhrby

correct output
3261

user output
3261

Test 7

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 1
a

correct output
1

user output
1

Test 8

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aabbbbbbba

correct output
1689

user output
1689

Test 9

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 8
abxabyab

correct output
8619

user output
8619

Test 10

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
ababababab

correct output
509

user output
509

Test 11

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Test 12

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
bbaaabbbbbabbbbabababababbbaab...

correct output
511493117

user output
511493117

Test 13

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
addabbbbbadddccadcabaacbbbaabd...

correct output
618572722

user output
618572722

Test 14

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
rrdumiqrjewanjplbyvkaytbcyzbyl...

correct output
35126431

user output
35126431

Test 15

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 1
a

correct output
1

user output
1

Test 16

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
460606355

user output
460606355

Test 17

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 23
aybabtuxaybabtuyaybabtu

correct output
342213037

user output
342213037

Test 18

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
ababababababababababababababab...

correct output
775006564

user output
775006564

Test 19

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Test 20

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
bbabaabbabbbaaaaaaaaaababaabbb...

correct output
911592620

user output
911592620

Test 21

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
cacabdddcbdadabdcbdddbdddbaccb...

correct output
12869296

user output
12869296

Test 22

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
tqoyadbshyehwcwaxbtbsqtaswkyet...

correct output
741984969

user output
741984969

Test 23

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 1
a

correct output
1

user output
1

Test 24

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
599950419

user output
599950419

Test 25

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 23
aybabtuxaybabtuyaybabtu

correct output
548809016

user output
548809016

Test 26

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
ababababababababababababababab...

correct output
765799780

user output
765799780

Test 27

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Test 28

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
bbaababbaaabbabababbaaaaaabbaa...

correct output
514073453

user output
514073453

Test 29

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
aabccabbbbabccabcdcdadbcdccdac...

correct output
438094288

user output
438094288

Test 30

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
yzfzimxrxfukhlkrtaylohyuqkupsn...

correct output
905445077

user output
905445077

Test 31

Group: 4, 5

Verdict: ACCEPTED

input
1000000 1
a

correct output
1

user output
1

Test 32

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
280596224

user output
280596224

Test 33

Group: 4, 5

Verdict: ACCEPTED

input
1000000 23
aybabtuxaybabtuyaybabtu

correct output
268144314

user output
268144314

Test 34

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
ababababababababababababababab...

correct output
655244665

user output
655244665

Test 35

Group: 5

Verdict: ACCEPTED

input
1000000000 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Test 36

Group: 5

Verdict: ACCEPTED

input
1000000000 50
abbbaabbaaaaabbbbabbabbaaaaaba...

correct output
911059863

user output
911059863

Test 37

Group: 5

Verdict: ACCEPTED

input
1000000000 50
cbabbcaadabbcabbdbdabbbcccbdca...

correct output
994268014

user output
994268014

Test 38

Group: 5

Verdict: ACCEPTED

input
1000000000 50
pehyicejeninplaczwezhahmbhwfwi...

correct output
837165971

user output
837165971

Test 39

Group: 5

Verdict: ACCEPTED

input
1000000000 1
a

correct output
1

user output
1

Test 40

Group: 5

Verdict: ACCEPTED

input
1000000000 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
114333489

user output
114333489

Test 41

Group: 5

Verdict: ACCEPTED

input
1000000000 23
aybabtuxaybabtuyaybabtu

correct output
628064772

user output
628064772

Test 42

Group: 5

Verdict: ACCEPTED

input
1000000000 50
ababababababababababababababab...

correct output
802946327

user output
802946327