0pts,差之毫厘谬以千里,大家千万别学我(自闭中)
查看原帖
0pts,差之毫厘谬以千里,大家千万别学我(自闭中)
117841
WDySrDbMoAuMc楼主2020/12/5 22:04

自闭事后诸葛亮在线抽嘴

请欣赏程序line 11(我氧化钙了)

1=送掉了,hhh

#include<bits/stdc++.h>
using namespace std;
int cnt[1005][200];
int T,n,tmp,k;
string s;
long long ans;
int count(int l,int r) {
	register int ret = 0;
	for(register int i = 'a'; i <= 'z'; ++i)
		if((cnt[r][i] - cnt[l - 1][i]) & 1)//问题就是出在这里,这里的l可以为0,,,,考试是超级评测姬给我直接忽略了,洛谷抱灵,,,,
			++ret;
	return ret;
}
bool check(int lt,int t) {
	register int l = lt / t;
	for(register int i = l,j = 0; i < lt; ++i,++j) {
		if(s[i] != s[j])
			return false;
		if(j == l - 1)
			j = -1;
	}
	return true;
}
int main() {
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	cin >> T;
	while(T--) {
		cin >> s;
		n = s.size();
		ans = 0;
		if(n > 1000) {
			for(int i = 1; i <= n - 2; ++i) {
				register int k = n - i,j = 2;
				if(i & 1) {
					if(k <= i + 1)
						ans += k - 1;
					else ans += i + (k - i) / 2;
					for(; j * j < k; ++j)
						if(!(k % j)) {
							if(k / j <= i + 1)
								ans += k / j - 1;
							else ans += i + (k / j - i) / 2;
							if(j <= i + 1)
								ans += j - 1;
							else ans += i + (j - i) / 2;
						}
					if(j * j == k)
						if(j <= i + 1)
							ans += j - 1;
						else ans += i + (j - i) / 2;

				} else {
					ans += (k - 1) / 2;
					for(; j * j < k; ++j)
						if(!(k % j))
							ans += (j - 1) / 2 + (k / j - 1) / 2;
					if(j * j == k)
						ans += (j - 1) / 2;
				}
			}
			cout << ans << endl;
			continue;
		}
		for(int i = 'a'; i <= 'z'; ++i)
			cnt[0][i] = 0;
		++cnt[0][int(s[0])];
		for(int i = 1; i < n; ++i) {
			for(int j = 'a'; j <= 'z'; ++j)
				cnt[i][j] = cnt[i - 1][j];
			++cnt[i][int(s[i])];
		}
		for(int i = n - 1; i > 1; --i) {
			tmp = count(i,n - 1);
			for(register int j = 1; j * j <= i; ++j)
				if(!(i % j)) {
					if(check(i,j))
						for(int k = 1; k < i / j; ++k)
							if(count(0,k - 1) <= tmp)
								++ans;
					if(j != 1 && j != i / j && check(i,i / j))
						for(int k = 1; k < j; ++k)
							if(count(0,k - 1) <= tmp)
								++ans;
				}

		}
		cout << ans << endl;
	}
	return 0;
}

我特么发誓,我以后数组再从0开始我就是~~@¥%……&/+¥%……¥%&……~~

大家千万千万别效仿我,这个错误不同的机子结果不一样

2020/12/5 22:04
加载中...