Submission details
Task:Merkkijonot
Sender:Gomhog
Submission time:2025-11-09 18:00:58 +0200
Language:C++ (C++11)
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.00 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.01 s2, 3, 4, 5details
#12ACCEPTED0.01 s2, 3, 4, 5details
#13ACCEPTED0.02 s2, 3, 4, 5details
#14ACCEPTED0.02 s2, 3, 4, 5details
#15ACCEPTED0.00 s2, 3, 4, 5details
#16ACCEPTED0.01 s2, 3, 4, 5details
#17ACCEPTED0.00 s2, 3, 4, 5details
#18ACCEPTED0.01 s2, 3, 4, 5details
#19ACCEPTED0.01 s3, 4, 5details
#20ACCEPTED0.01 s3, 4, 5details
#21ACCEPTED0.02 s3, 4, 5details
#22ACCEPTED0.02 s3, 4, 5details
#23ACCEPTED0.00 s3, 4, 5details
#24ACCEPTED0.02 s3, 4, 5details
#25ACCEPTED0.00 s3, 4, 5details
#26ACCEPTED0.01 s3, 4, 5details
#27ACCEPTED0.01 s4, 5details
#28ACCEPTED0.01 s4, 5details
#29ACCEPTED0.02 s4, 5details
#30ACCEPTED0.03 s4, 5details
#31ACCEPTED0.00 s4, 5details
#32ACCEPTED0.03 s4, 5details
#33ACCEPTED0.01 s4, 5details
#34ACCEPTED0.01 s4, 5details
#35ACCEPTED0.01 s5details
#36ACCEPTED0.01 s5details
#37ACCEPTED0.03 s5details
#38ACCEPTED0.03 s5details
#39ACCEPTED0.00 s5details
#40ACCEPTED0.04 s5details
#41ACCEPTED0.01 s5details
#42ACCEPTED0.01 s5details

Code

#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long long ll;
typedef long double ld;

const ll M = 1000000007;
ll mat[3550][3550];
ll ret[3550];
ll tmp[3550][3550];
ll tmp2[3550];
bool accept[3550];

vector<int> gr[3550];

map<char,int> trie[3010];
//set<int> prefpos[3010];
vector<char> made[3010];
int name[3010];

void merge(int si) {
    for (int i=0;i<si;i++) name[i]=i;
    bool merged=true;
    while (merged) {
        merged=false;
        for (int i=0;i<si;i++) {
            if (name[i]!=i) continue;
            for (int j=i+1;j<si;j++) {
                if (accept[j]) continue;
                if (name[j]!=j) continue;
                if (gr[i].size()!=gr[j].size()) continue;
                bool same=true;
                for (int ii=0;ii<(int)gr[i].size();ii++) {
                    if (gr[i][ii]!=gr[j][ii]) same=false;
                }
                if (same) {
                    merged=true;
                    name[j]=i;
                    for (int k=0;k<si;k++) {
                        if (name[k]!=k) continue;
                        for (int kk=0;kk<(int)gr[k].size();kk++) {
                            if (gr[k][kk]==j) {
                                gr[k][kk]=i;
                                sort(gr[k].begin(),gr[k].end());
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}

int buildMat(int si) {
    map<int,int> new_names;
    int cntr=0;
    for (int i=0;i<si;i++) {
        if (name[i]==i) new_names[i]=cntr++;
    }
    for (auto x : new_names) {
        for (int y : gr[x.F]) {
            mat[new_names[y]][x.S]=1;
        }
    }

    return cntr;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    string s;
    cin>>s;
    
    for (int i=0;i<m-1;i++) {
        gr[i].push_back(i+1);
//        mat[i+1][i]=1;
        map<char,int> tar;
        for (int j=i;j>=0;j--) {
            bool pos=true;
            for (int k=0;j+k<i;k++) {
                if (s[k]!=s[j+k+1]) pos=false;
            }
            if (pos) {
                if (s[i+1]!=s[i-j]) tar[s[i-j]]=i-j;
            }
        }
        for (auto x : tar) {
            gr[i].push_back(x.S);
//            mat[x.S][i]=1;
        }
    }
    
    accept[m-1]=true;

    int newest=0;

    for (int i=m-1;i>0;i--) {
        int nod=0;
        for (int j=i;j<m;j++) {
            if (trie[nod].count(s[j])==0) {
                if (j==m-1) trie[nod][s[j]]=0; 
                else {
                    trie[nod][s[j]]=++newest;
                    for (char c : made[nod]) made[newest].push_back(c);
                    made[newest].push_back(s[j]);
                }
            }
//            if (s[j]==s[0]) prefpos[trie[nod][s[j]]].insert(0);
//            for (int r : prefpos[nod]) {
//                if (s[j]==s[r+1]) prefpos[trie[nod][s[j]]].insert(r+1);
//            }
            nod=trie[nod][s[j]];
            if (accept[m-1+nod]) break;
        }
        accept[m-1+nod]=true;
    }

    int si=newest+1;

    for (int i=0;i<si;i++) {
        if (accept[m-1+i]) {
            for (auto x : trie[0]) {
                gr[m-1+i].push_back(m-1+x.S);
//                mat[m-1+x.S][m-1+i]=1;
            }
            if (trie[0].count(s[0])==0) {
                gr[m-1+i].push_back(0);
//                mat[0][m-1+i]=1;
            }
        } else {
            for (auto x : trie[i]) {
                gr[m-1+i].push_back(m-1+x.S);
//                mat[m-1+x.S][m-1+i]=1;
            }
            map<char,int> resets;
            int kk=made[i].size();
            for (int k=0;k<=kk;k++) {
                bool ok=true;
                for (int j=0;j<k;j++) {
                    if (s[j]!=made[i][kk-(k-j)]) ok=false;
                }
                if (ok && trie[i].count(s[k])==0) resets[s[k]]=k;
            }
            for (auto x : resets) {
                gr[m-1+i].push_back(x.S);
//                mat[x.S][m-1+i]=1;
            }
        }
    }

    
/*    for (int i=0;i<si;i++) {
        if (trie[i].count(s[0])==0) trie[i][s[0]]=-(m-1);
        for (int x : prefpos[i]) {
            if (x<m-1 && (trie[i].count(s[x+1])==0 || trie[i][s[x+1]] <=0)) trie[i][s[x-1]]=-(m-1)+x+1; 
        }
    }

    for (int i=0;i<si;i++) {
        if (accept[m-1+i]) {
            for (auto x : trie[0]) {
                mat[m-1+x.S][m-1+i] = 1;
            }
        } else {
            for (auto x : trie[i]) {
                mat[m-1+x.S][m-1+i]=1;
            }

        }
    }
*/
    int mm = m+si-1;
    for (int i=0;i<mm;i++) sort(gr[i].begin(),gr[i].end());
    merge(mm);
    int msi = buildMat(mm);
    assert(name[m-1]==m-1);
//    cerr<<mm<<endl;

/*    for (int i=0;i<mm;i++) {
        for (int j=0;j<mm;j++) cerr<<mat[i][j]<<" ";
        cerr<<endl;
    }
*/
    ret[0]=1;
    int e = n-1;
/*    for (int i=0;i<e;i++) {
        for (int j=0;j<mm;j++) {
            tmp2[j]=0;
        }
        for (int j=0;j<mm;j++) {
            for (int x : gr[j]) {
                tmp2[x]+=ret[j];
            }
        }
        for (int j=0;j<mm;j++) ret[j]=tmp2[j]%M;
    }*/
    while (e>0) {
        if (e%2==1) {
            for (int i=0;i<msi;i++) {
                tmp2[i]=0;
                for (int j=0;j<msi;j++) {
                    tmp2[i]+=(mat[i][j]*ret[j])%M;
                }
            }
            for (int i=0;i<msi;i++) ret[i]=tmp2[i]%M;
        }
        for (int i=0;i<msi;i++) {
            for (int j=0;j<msi;j++) {
                tmp[i][j]=0;
                for (int k=0;k<msi;k++) {
                    tmp[i][j]+=(mat[i][k]*mat[k][j]);
                    if ((k&7)==0) tmp[i][j]%=M;
                }
            }
        }
        for (int i=0;i<msi;i++) {
            for (int j=0;j<msi;j++) mat[i][j]=tmp[i][j]%M;
        }
        e/=2;
    }
    ll res=0;
    for (int i=0;i<msi;i++) {
        if (accept[i]) res+=ret[i];
    }
    cout<<res%M<<"\n";
}

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