瞎胡解法,68 分,不知道哪里假了,求小 hack
查看原帖
瞎胡解法,68 分,不知道哪里假了,求小 hack
377873
EricWan楼主2023/9/27 20:43

现在我的最小的hack:

owtowtowtymejyevijvpyjuzichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichichinbzqgvxkmenrmoouqbksmnojfilonsifgrzjktvpretlnpxeucqmwsohdyghvbzpuciwjzsvonyuhbpuvczcjixrxluleidhedvnebxrcopmpksrzeqmdktxlavwxfkmchuaylxefzdtfworieunzfniiyphmtwopifteokjlabedsalcafleyfefwmtqzwpbptaybxyfbilmoqjxmzngtnzfrqlsoquezmddfaslbepwgtwgzfvaywazleavvmrfpkbdfpuptpckg

我的代码:

#include <bits/stdc++.h>
#define int long long
#define us unsigned
using namespace std;
int n, xorsum[2000005], boxs[30], ans;
us int h[2000005], p[2000005];
string s;
us int hs(int l, int r)
{
	return h[r] - h[l - 1] * p[r - l + 1];
}
int xo(int l, int r)
{
	return xorsum[r] ^ xorsum[l - 1];
}
int sumnum(int x)
{
	int ans = 0;
	while (x)
	{
		if (x & 1)
		{
			ans++;
		}
		x >>= 1;
	}
	return ans;
}
signed main()
{
	//freopen("string4.in","r",stdin);
	int t;
	cin >> t;
	while (t--)
	{
		cin >> s;
		int n = s.size();
		s = " " + s;
		p[0] = 1;
		ans = 0;
		memset(boxs,0,sizeof(boxs));
		for (int i = 1; i <= n; i++)
		{
			p[i] = p[i - 1] * 10;
			h[i] = h[i - 1] * 10 + s[i] - 'a' + 1;
			xorsum[i] = xorsum[i - 1] ^ (1 << s[i] - 'a');
		}
//		for (int i = 1; i <= n; i++)
//		{
//			for (int j = i; j <= n; j++)
//			{
//				cout << hs(i,j) << " ";
//			}
//			cout << endl;
//		}
		for (int i = 1; i < n; i++)
		{
			int bc, j = 0;
			for (bc = 1; bc + i - 1 < n; bc += i)
			{
				if (hs(bc,bc + i - 1) != hs(1,i))
				{
					break;
				}
				j++;
			}
			int sc = sumnum(xo(bc,n)), sc2 = sumnum(xo(bc,n) ^ xo(1,i)), csa1 = 0, csa2 = 0;
			for (int k = 0; k <= sc; k++)
			{
				csa1 += boxs[k];
			}
			for (int k = 0; k <= sc2; k++)
			{
				csa2 += boxs[k];
			}
			ans += csa1 * ((j + 1) / 2);
			ans += csa2 * (j / 2);
//			cout << i << ": " << j << " " << csa1 << " " << csa2 << " " << sc << " " << sc2 << "  " << sumnum(xo(1,i)) << "   add ans " << csa1 * j + csa2 * (j - 1) << endl;
			boxs[sumnum(xo(1,i))]++;
		}
		cout << ans << endl;
	}
    return 0;
}

求小 hack。

2023/9/27 20:43
加载中...