Submission details
Task:Merkkijonot
Sender:Sisuaski
Submission time:2025-11-09 20:58:38 +0200
Language:C++ (C++20)
Status:READY
Result:18
Feedback
groupverdictscore
#1ACCEPTED18
#20
#30
#40
#50
Test results
testverdicttimegroup
#1ACCEPTED0.02 s1, 2, 3, 4, 5details
#2ACCEPTED0.14 s2, 3, 4, 5details
#3ACCEPTED0.02 s1, 2, 3, 4, 5details
#4ACCEPTED0.02 s1, 2, 3, 4, 5details
#5ACCEPTED0.02 s1, 2, 3, 4, 5details
#6ACCEPTED0.02 s1, 2, 3, 4, 5details
#7ACCEPTED0.02 s1, 2, 3, 4, 5details
#8ACCEPTED0.02 s1, 2, 3, 4, 5details
#9ACCEPTED0.02 s1, 2, 3, 4, 5details
#10ACCEPTED0.02 s1, 2, 3, 4, 5details
#11ACCEPTED0.02 s2, 3, 4, 5details
#12ACCEPTED0.02 s2, 3, 4, 5details
#13--2, 3, 4, 5details
#140.04 s2, 3, 4, 5details
#15ACCEPTED0.02 s2, 3, 4, 5details
#16ACCEPTED0.05 s2, 3, 4, 5details
#17ACCEPTED0.03 s2, 3, 4, 5details
#18ACCEPTED0.02 s2, 3, 4, 5details
#19ACCEPTED0.03 s3, 4, 5details
#20--3, 4, 5details
#21--3, 4, 5details
#220.04 s3, 4, 5details
#23ACCEPTED0.02 s3, 4, 5details
#24ACCEPTED0.06 s3, 4, 5details
#25ACCEPTED0.03 s3, 4, 5details
#26ACCEPTED0.03 s3, 4, 5details
#27ACCEPTED0.04 s4, 5details
#28ACCEPTED0.04 s4, 5details
#29--4, 5details
#300.04 s4, 5details
#31ACCEPTED0.02 s4, 5details
#32ACCEPTED0.09 s4, 5details
#33ACCEPTED0.04 s4, 5details
#34ACCEPTED0.03 s4, 5details
#35ACCEPTED0.04 s5details
#36ACCEPTED0.13 s5details
#37--5details
#380.04 s5details
#39ACCEPTED0.03 s5details
#40ACCEPTED0.12 s5details
#41ACCEPTED0.05 s5details
#42ACCEPTED0.04 s5details

Code

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long ll;

const int Z = 1e9+7;
const int A = 'z'-'a'+1;
struct Node {
	int cs[A];
};
Node nodes[10240];
int C;

struct NN {
	vector<int> out;
	int type;
	int par;

	bool operator==(const NN& n) const {
		if (type != n.type) return 0;
		if (out.size() != n.out.size()) return 0;
		for(size_t i=0; i<out.size(); ++i) if (out[i]!=n.out[i]) return 0;
		return 1;
	}
};
NN nns[10240];
int newIdx[10240];

struct NNH {
	size_t operator()(const NN& n) const {
		size_t h=n.type;
		for(size_t i=0; i<n.out.size(); ++i) {
			h = h*3333331 + n.out[i];
		}
		return h;
	}
};

int getP(int i) {
	if (nns[i].par==i) return i;
	return nns[i].par = getP(nns[i].par);
}
void normalize(int i) {
	NN& n = nns[i];
	for(int& x: n.out) {
		x = getP(x);
	}
	sort(n.out.begin(),n.out.end());
}

struct Mat {
	static const int MS = 1000;
	int a[MS][MS];

	const int* operator[](int i)const{return a[i];}
	int* operator[](int i){return a[i];}
};

Mat operator*(const Mat& a, const Mat& b) {
	Mat m;
	for(int i=0; i<C; ++i) {
		for(int j=0; j<C; ++j) {
			ll r=0;
			for(int k=0; k<C; ++k) {
				r += (ll)a[i][k] * b[k][j] % Z;
			}
			m[i][j] = r % Z;
		}
	}
	return m;
}
Mat mpow(Mat m, int e) {
#if 0
	if (e==1) return m;
	Mat r = mpow(m*m,e/2);
	return e&1 ? r*m : r;
#else
	Mat res={};
	for(int i=0; i<C; ++i) res[i][i]=1;
	for(int i=1; i<=e; i*=2, m=m*m) {
		if (e&i) res = res*m;
	}
	return res;
#endif
}

string s;

void addPrefix(int ci, string cur) {
	Node& c = nodes[ci];
	cur.push_back(0);
	for(int i=0; i<A; ++i) {
		cur[cur.size()-1]='a'+i;
		if (c.cs[i]<0) {
			string x = cur;
			while(x != s.substr(0,x.size())) x = x.substr(1);
			if (!x.empty()) {
				c.cs[i] = x.size();
			}
		} else if (c.cs[i]>ci) {
			addPrefix(c.cs[i], cur);
		}
	}
}

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

	memset(nodes,-1,sizeof(nodes));

	for(int k=0; k<m; ++k) {
		for(char c='a'; c<='z'; ++c) {
			string cur = s.substr(0,k) + c;
			int x=cur.size();
			for(;x>0 && s.substr(0,x)!=cur.substr(cur.size()-x);x--);
			if (!x) continue;
			nodes[k].cs[c-'a'] = x;
		}
	}
	C = m+1;

	for(int k=m-1; k>=0; --k) {
		int ci = m;
		for(int j=k; j<m; ++j) {
			int x = s[j]-'a';
			Node& c = nodes[ci];
			if (j+1<m) {
				if (c.cs[x]<0) c.cs[x] = C++;
				ci = c.cs[x];
			} else c.cs[x] = m;
			if (ci==1) break;
		}
	}
	addPrefix(m, "");

	for(int i=0; i<C; ++i) {
		nns[i].type = i==0 ? 0 : i==m ? 1 : 2;
		nns[i].par=i;
		for(int j=0; j<A; ++j) {
			int t = nodes[i].cs[j];
			if (t<0) continue;
			nns[i].out.push_back(t);
		}
	}
	bool doMerge = 0;
	while(doMerge) {
		doMerge = 0;
		unordered_map<NN,int,NNH> nmap;
		for(int i=0; i<C; ++i) {
			auto it = nmap.find(nns[i]);
			if (it == nmap.end()) {
				nmap[nns[i]] = i;
			} else {
				nns[i].par = it->second;
				doMerge = 1;
			}
		}

		for(int i=0; i<C; ++i) {
			normalize(i);
		}

		int cc=0;
		for(int i=0; i<C; ++i) {
			if (nns[i].par != i) continue;
			newIdx[i] = cc;
			nns[cc] = nns[i];
			nns[cc].par = cc;
			cc++;
		}
		C = cc;

		for(int i=0; i<C; ++i) {
			for(int& x: nns[i].out) x = newIdx[x];
		}
	}

	int st=0,ed=0;
	for(int i=0; i<C; ++i) {
		if (nns[i].type==0) st=i;
		if (nns[i].type==1) ed=i;
	}

	Mat mat={};
	for(int i=0; i<C; ++i) {
		for(int t: nns[i].out) mat[i][t]++;
	}
	Mat res = mpow(mat,n);
	cout<<res[st][ed]<<'\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:

input
100 50
addabbbbbadddccadcabaacbbbaabd...

correct output
618572722

user output
(empty)

Test 14

Group: 2, 3, 4, 5

Verdict:

input
100 50
rrdumiqrjewanjplbyvkaytbcyzbyl...

correct output
35126431

user output
(empty)

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:

input
1000 50
bbabaabbabbbaaaaaaaaaababaabbb...

correct output
911592620

user output
(empty)

Test 21

Group: 3, 4, 5

Verdict:

input
1000 50
cacabdddcbdadabdcbdddbdddbaccb...

correct output
12869296

user output
(empty)

Test 22

Group: 3, 4, 5

Verdict:

input
1000 50
tqoyadbshyehwcwaxbtbsqtaswkyet...

correct output
741984969

user output
(empty)

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:

input
1000000 50
aabccabbbbabccabcdcdadbcdccdac...

correct output
438094288

user output
(empty)

Test 30

Group: 4, 5

Verdict:

input
1000000 50
yzfzimxrxfukhlkrtaylohyuqkupsn...

correct output
905445077

user output
(empty)

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:

input
1000000000 50
cbabbcaadabbcabbdbdabbbcccbdca...

correct output
994268014

user output
(empty)

Test 38

Group: 5

Verdict:

input
1000000000 50
pehyicejeninplaczwezhahmbhwfwi...

correct output
837165971

user output
(empty)

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