UOJ 过不去,求卡常
查看原帖
UOJ 过不去,求卡常
911417
_Z_F_R_楼主2024/7/19 15:44

rt,code:

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
ll Read() {
	int sig = 1;
	ll num = 0;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') {
			sig = -1;
		}
		c = getchar();
	}
	while(isdigit(c)) {
		num = (num << 3) + (num << 1) + (c ^ 48);
		c = getchar();
	}
	return num * sig;
}
void Write(ll x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) {
		Write(x / 10);
	}
	putchar((x % 10) ^ 48);
}

const ll Mod = 1000000009;
const int N = 1050005;
ll f[N][27], g[N];
ll hsh[N], p26[N];
inline bool Same(int l1, int r1, int l2, int r2) {
	return (r1 - l1 == r2 - l2 && (hsh[r1] - hsh[l1 - 1] * p26[r1 - l1 + 1] % Mod + Mod) % Mod == (hsh[r2] - hsh[l2 - 1] * p26[r2 - l2 + 1] % Mod + Mod) % Mod);
}
inline void Solve() {
	string s;
	char c = getchar();
	while(c < 'a' || c > 'z') {
		c = getchar();
	}
	while(c >= 'a' && c <= 'z') {
		s.push_back(c);
		c = getchar();
	}
	register int i, j;
	int n = s.size();
	s = "$" + s + "$";
	ll h = 0;
	p26[0] = 1;
	for(i = 1; i <= n; i++) {
		memcpy(f[i], f[i - 1], sizeof(f[i]));
		h ^= 1 << (s[i] - 'a');
		hsh[i] = (hsh[i - 1] * 26ll % Mod + s[i] - 'a') % Mod;
		for(j = __builtin_popcount(h); j < 27; j++) {
			f[i][j]++;
		}
	}
	h = 0;
	for(i = n; i >= 1; i--) {
		h ^= 1 << (s[i] - 'a'); 
		g[i] = __builtin_popcount(h);
	}
	ll ans = 0;
	for(i = 2; i < n; i++) {
		for(j = 1; j * i < n; j++) {
			if(!Same(1, i, i * (j - 1) + 1, i * j)) {
				break;
			}
			ans += f[i - 1][g[j * i + 1]];
			//			cout << f[g[j * i + 1]][i - 1] << endl;
		}
	}
	Write(ans), putchar('\n');
	for(i = 1; i <= n; i++) {
		g[i] = 0;
		hsh[i] = 0;
	}
}
int main() {
	int i;
	p26[0] = 1;
	for(i = 1; i <= N - 5; i++) {
		p26[i] = p26[i - 1] * 26ll % Mod;
	}
	int testcase = Read();
	while(testcase--) {
		Solve();
	}
}
2024/7/19 15:44
加载中...