求助 TLE/RE
查看原帖
求助 TLE/RE
639563
封禁用户楼主2024/3/28 20:17

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);
}
2024/3/28 20:17
加载中...