马蜂良好的 AT_abc346_f 求条
  • 板块灌水区
  • 楼主CuteChat
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/3/23 21:45
  • 上次更新2024/3/23 23:32:21
查看原帖
马蜂良好的 AT_abc346_f 求条
726525
CuteChat楼主2024/3/23 21:45
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#define int __int128

int n, sl, tl, nxt[100005][29], id[1000005];
vector<int> pos[29];
char s[100007], t[100005];

int Next(int i, int k, int c) {
	if (k == 0) return i;
	c -= 'a';
	// 从 s 的位置 i 开始跳,匹配字符 c k 次
	int tmp = i % sl, ans = i;
	if (pos[c].size() == 0) return -1; // 匹配不了啊
	if (nxt[tmp][c] != -1) {
		ans += nxt[tmp][c] - tmp;
		tmp = nxt[tmp][c];
	} else {
		ans += pos[c][0] + sl - tmp;
		tmp = pos[c][0];
	}
	if (ans >= n * sl) return -1;
	// 第一步,确保自己在目标字符上
	--k;
	if (k == 0) return ans;
	ans += sl * (k / pos[c].size());
	k %= pos[c].size();
	//printf("%d\n", tmp);
	if (k == 0) return ans;
	int nextpos = pos[c][(id[tmp] + k) % (__int128)(pos[c].size())];
	return ans + (nextpos - tmp + sl + sl) % sl;
}

bool check(int i) {
	int pos = 0	;
	for (int j = 0; j < tl; ++j) {
//		printf("调用 Next(%lld, %lld, %c) 后,", (long long)pos, (long long)i, t[j]);
		pos = Next(pos, i, t[j]);
//		printf("pos = %lld\n", (long long )pos);
		if (pos == -1 || pos >= n * sl) return 0;
		++pos;
	}
	return 1;
}

void write(int x) {
	int st[35], top = 0;
	while (x) st[++top] = x % 10, x /= 10;
	while (top) putchar(st[top--] + '0');
}

signed main() {
//	freopen("dat.in", "r", stdin);
	long long nn; scanf("%lld", &nn); n = nn;
	scanf("%s%s", s, t);
	sl = strlen(s);
	tl = strlen(t);
	memset(nxt, 255, sizeof(nxt));
	for (int i = sl - 1; i >= 0; --i) {
		pos[s[i] - 'a'].push_back(i);
		id[i] = pos[s[i] - 'a'].size() - 1;
		for (int c = 0; c < 28; ++c) nxt[i][c] = nxt[i + 1][c];
		nxt[i][s[i] - 'a'] = i;
	}
//	printf("%lld\n", check(7)); return 0;
	int l = 0, r = 1e18;
	while (l + 1 != r) {
		int mid = (l + r) / 2;
		if (check(mid)) l = mid;
		else r = mid;
	}
	write(l);
	return 0;
}	
2024/3/23 21:45
加载中...