比赛 2026.1.3 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 字符串游戲 最终得分 100
用户昵称 终焉折枝 运行时间 1.762 s
代码语言 C++ 内存使用 104.23 MiB
提交时间 2026-01-03 11:08:05
显示代码纯文本
#include<iostream>
#include<cstring>
using namespace std;

const int MAXN = 205;
const int MAXM = 25;
const int INF = 0x3f3f3f3f;
//f[l][r] 消除区间所需的最小次数
int f[MAXN][MAXN];
//g[l][r][i][k] 区间 l , r 删至只剩第 i 个模式串的前 j 个字符的最小次数
int g[MAXN][MAXN][MAXM][MAXM];
int n, m, k, c[MAXN], ans[MAXN][MAXN];
string s, w[MAXM];

int main(){
	freopen("string.in", "r", stdin);
	freopen("string.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m >> k;
	cin >> s;
	s = " " + s;
	for(int i = 1;i <= m;i ++){
		cin >> w[i];
		c[i] = w[i].length();
		w[i] = " " + w[i];
	}
	memset(f, 0x3f, sizeof(f));
	memset(g, 0x3f, sizeof(g));
	for(int i = 1;i <= n + 1;i ++){
		f[i][i - 1] = 0;
		for(int j = 1;j <= m;j ++){
			g[i][i - 1][j][0] = 0;
		}
	}
	for(int len = 1;len <= n;len ++){
		for(int l = 1;l + len - 1 <= n;l ++){
			int r = l + len - 1;
			for(int i = 1;i <= m;i ++){
				for(int j = 1;j <= c[i];j ++){
					if(s[r] == w[i][j]){
						g[l][r][i][j] = min(g[l][r][i][j], g[l][r - 1][i][j - 1]);
					}
				}
				for(int mid = l;mid <= r;mid ++){
					if(f[mid][r] <= k){
						for(int j = 0;j <= c[i];j ++){
							if(g[l][mid - 1][i][j] < INF){
								g[l][r][i][j] = min(g[l][r][i][j], g[l][mid - 1][i][j] + f[mid][r]);
							}
						}
					}
				}
				if(g[l][r][i][c[i]] < INF){
					f[l][r] = min(f[l][r], g[l][r][i][c[i]] + 1);
				}
			}
		}
	}
	memset(ans, 0x3f, sizeof(ans));
	for(int j = 0;j <= k;j ++){
		ans[0][j] = 0;
	}
	for(int i = 1;i <= n;i ++){
		for(int j = 0;j <= k;j ++){
			ans[i][j] = ans[i - 1][j] + 1;
			for(int pre = 1;pre <= i;pre ++){
				if(f[pre][i] <= j){
					ans[i][j] = min(ans[i][j], ans[pre - 1][j - f[pre][i]]);
				}
			}
		}
	}
	int res = n;
	for(int j = 0;j <= k;j ++) res = min(res, ans[n][j]);
	cout << res << '\n';
	return 0;
}