现在我的最小的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。