rt,没开 O2 TLE,开了 O2 RE,在学校 OJ 上测是 RE 82
// Problem: F. Hamsters
// Contest: LibreOJ - 矩阵的应用2
// URL: http://www.nfls.com.cn:20035/contest/1931/problem/6
// Memory Limit: 128 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#ifdef LOCAL
#include "debugger.h"
#define debug(x) (cerr << "LINE " << __LINE__ << ", " << #x << " = ", __HARVEY_DEBUG__::print(x), cerr << endl)
#define debug_arr(x, n) (cerr << "LINE " << __LINE__ << ", " << #x << " = ", __HARVEY_DEBUG__::printarr(x, n), cerr << endl)
#else
#include <bits/stdc++.h>
#define debug(x) 114514
#define debug_arr(x, n) 1919810
#endif
using namespace std;
#define ll long long
ll max(int a, ll b) { return max((ll)a, b); }
ll min(int a, ll b) { return min((ll)a, b); }
ll max(ll a, int b) { return max(a, (ll)b); }
ll min(ll a, int b) { return min(a, (ll)b); }
// Your code goes here...
int n;
struct mat {
ll a[105][105];
mat() {
memset(a, 0x3f, sizeof a);
}
ll* operator [](int x) {
return a[x];
}
};
const mat operator *(mat a, mat b) {
mat c;
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c[i][j] = min(c[i][j], a[i][k] + b[k][j]);
}
}
}
return c;
}
mat qpow(mat a, ll x) {
mat ans;
for (int i = 0; i < n; i++) {
ans[i][i] = 0;
}
while (x) {
if (x & 1) {
ans = ans * a;
}
x >>= 1;
a = a * a;
}
return ans;
}
#define ull unsigned ll
vector<ull> pre[205], suf[205];
int sz[205];
ull p[100005];
int main() {
p[0] = 1;
for (int i = 1; i <= 100003; i++) {
p[i] = p[i - 1] * 131;
}
ll m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
sz[i] = s.size();
ull x = 0;
for (int j = 0; j < sz[i]; j++) {
x = x * 131 + s[j];
pre[i].push_back(x);
}
x = 0;
for (int j = sz[i] - 1; j >= 0; j--) {
x += p[sz[i] - j - 1] * s[j];
suf[i].push_back(x);
}
}
mat a;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = -1;
for (int k = min(sz[i], sz[j]) - 1 - (i == j); k >= 0; k--) {
if (suf[i][k] == pre[j][k]) {
a[i][j] = sz[j] - k - 1;
break;
}
}
if (a[i][j] == -1) {
a[i][j] = sz[j];
}
// cerr << a[i][j] << " ";
}
// cerr << endl;
}
a = qpow(a, m - 1);
ll ans = 0x3f3f3f3f3f3f3f3fll;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ans = min(ans, sz[i] + a[i][j]);
}
}
printf("%lld", ans);
}