求问刚刚比赛T5的满分暴力解法
  • 板块学术版
  • 楼主gghack_Nythix
  • 当前回复18
  • 已保存回复18
  • 发布时间2024/8/23 18:38
  • 上次更新2024/8/23 21:14:16
查看原帖
求问刚刚比赛T5的满分暴力解法
895690
gghack_Nythix楼主2024/8/23 18:38

rt,只会80pts

#include<bits/stdc++.h>
using namespace std;
#define nor unsigned long long
const int bit = 3;
char ch[2048];
int n;
nor H[2048],sum[2048],ksm[2048],TT;
bool chk(int l1,int r1,int l2,int r2) {
	for(int i1 = l1,i2 = l2;i1 <= r1 && i2 <= r2;++i1,++i2) if(!(ch[i1] == ch[i2] || ch[i1] == '?' || ch[i2] == '?')) return 0;
	return 1; 
}
void solve() {
	int ans = 0;
	cin >> n;
	int fg = 0;
	for(int i = 1;i <= n;++i) cin >> ch[i],fg += ch[i] == '?';
	for(int i = 1;i <= n;++i) H[i] = rand();
	if(!fg){
		ksm[0] = 1;
		for(int i = 1;i <= n;++i) sum[i] = (sum[i - 1] * bit + (ch[i] - '0')),ksm[i] = (ksm[i - 1] * bit);
		for(int l = 1;l <= n;++l) {
			for(int r = l + 1;r <= n;r += 2) {
				int mid = l + r >> 1;
				if(sum[mid] - sum[l - 1] * ksm[r - mid] == sum[r] - sum[mid] * ksm[r - mid]) ans = max(ans,r - l + 1);
			}
		}
		return cout << ans / 2 << '\n',void();
	}
	for(int l = 1;l <= n;++l) {
		for(int r = ans + l - 1;r <= n;r += 2) {
			if(r - l + 1 <= ans) continue;
			int mid = l + r >> 1;
			if(chk(l,mid,mid + 1,r)) ans = max(ans,r - l + 1);
		}
	}
	return cout << ans / 2 << '\n',void();
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin >> T;
	TT = T;
	while(T-->0)solve();
}
2024/8/23 18:38
加载中...