CSP-S T2 求调
  • 板块学术版
  • 楼主GI录像机
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/26 10:56
  • 上次更新2023/10/26 11:07:49
查看原帖
CSP-S T2 求调
142969
GI录像机楼主2023/10/26 10:56

过了 CF1223F,略微修改后样例本地全过,但是交上去没一个点过掉。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (c > '9' || c < '0') {
		if (c == '-')f = -f;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}
char chread() {
	char c = getchar();
	while (c > 'z' || c < 'a')c = getchar();
	return c;
}
int n;
long long cnt;
struct Matrix {
	int a[2][2];
	Matrix() {
		memset(a, 0, sizeof(a));
	}
	void build() {
		a[0][0] = a[1][1] = 1;
		a[1][0] = a[0][1] = 0;
	}
} s[30], sum, inv[30];
Matrix mul(Matrix x, Matrix y) {
	Matrix tmp;
	for (int i = 0; i <= 1; i++)
		for (int j = 0; j <= 1; j++)
			for (int k = 0; k <= 1; k++) {
				tmp.a[i][j] = (1ll * x.a[i][k] * y.a[k][j] + tmp.a[i][j]) % MOD;
				tmp.a[i][j] = (tmp.a[i][j] + MOD) % MOD;
			}

	return tmp;
}
map<array<int, 4>, int>mp;
int qpow(int a, int b) {
	int r = 1;
	while (b) {
		if (b & 1)r = (1ll * r * a) % MOD;
		a = (1ll * a * a) % MOD;
		b >>= 1;
	}
	return (r + MOD) % MOD;
}
int main() {
	//freopen("game.in", "r", stdin);
	//freopen("game.out", "w", stdout);
	n = read();
	srand(n + 114514);
	for (int i = 0; i <= 26; i++) {
		s[i].a[0][0] = rand() + 1;
		s[i].a[0][1] = rand() + 1;
		s[i].a[1][0] = rand() + 1;
		s[i].a[1][1] = rand() + 1;
		int ttmp = qpow(s[i].a[0][0] * s[i].a[1][1] - s[i].a[1][0] * s[i].a[0][1], MOD - 2);
		inv[i].a[0][0] = (1ll * s[i].a[1][1] * ttmp) % MOD;
		inv[i].a[0][1] = ((-1ll * s[i].a[0][1] * ttmp) % MOD) + MOD;
		inv[i].a[1][0] = ((-1ll * s[i].a[1][0] * ttmp) % MOD) + MOD;
		inv[i].a[1][1] = (1ll * s[i].a[0][0] * ttmp) % MOD;
	}
	sum.build();
	array<int, 4>tmp;
	tmp[0] = tmp[3] = 1;
	tmp[1] = tmp[2] = 0;
	mp[tmp] = 1;
	for (int i = 1; i <= n; i++) {
		int c = chread() - 'a';
		sum = mul(sum, (i & 1) ? s[c] : inv[c]);
		tmp[0] = sum.a[0][0];
		tmp[1] = sum.a[0][1];
		tmp[2] = sum.a[1][0];
		tmp[3] = sum.a[1][1];
		cnt += mp[tmp]++;
	}
	cout << cnt << endl;
	return 0;
}
2023/10/26 10:56
加载中...