赛时勾石代码求条,给hack也可
查看原帖
赛时勾石代码求条,给hack也可
1120016
wuyuxuan12345678楼主2024/10/23 21:50
#include<bits/stdc++.h>
using namespace std;
int t,n,cnt,flag,maxn,maxm,maxx,ff;
string s;
struct aaa{
	int id,sum,l,r;
}a[100050];
bool cmp(aaa aa,aaa bb){
	return aa.sum>bb.sum;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>s;
		cnt=0;
		ff=0;
		flag=0;
		maxn=0;
		maxm=0;
		maxx=0;
		for(register int i=0;i<=n-1;i++){
			if(s[i]=='T'){
				ff=1;
			}
			if(s[i]=='T'&&flag){
				if(i==n-1){
					a[cnt].r=i;
					a[cnt].sum=i+1-a[cnt].l;
					maxn=max(maxn,a[cnt].sum);
				}
				continue;
			}
			if(s[i]=='T'&&s[i+1]=='T'&&!flag){
				cnt++;
				a[cnt].id=cnt;
				a[cnt].l=i;
				if(i==n-2){
					a[cnt].r=n-1;
					a[cnt].sum=2;
					maxn=max(maxn,a[cnt].sum);
				}
				i++;
				flag=1;
			}else{
				if(flag){
					a[cnt].r=i-1;
					a[cnt].sum=i-a[cnt].l;
					maxn=max(maxn,a[cnt].sum);
				}
				flag=0;
			}
		}
		
		
		
		if(maxn==0&&ff){
			printf("1\n");
			continue;
		}
		if(!ff){
			printf("0\n");
			continue;
		}
		if(cnt==1){
			printf("%d\n",maxn);
			continue;
		}
		sort(a+1,a+cnt+1,cmp);
		register int ll,rr;
		for(register int i=1;i<=n;i++){
			if(a[i].sum<=maxn-1){
				if(maxx==1){
					printf("%d\n",maxn+1);
					break;
				}
			}
			if(a[i].sum==maxn){
				maxm=0;
				ll=a[i].l,rr=a[i].r;
				while(ll-2>=0){
					if(s[ll-1]=='B'&&s[ll-2]=='T'){
						ll-=2;
					}else if(s[ll-1]=='T'&&s[ll-2]=='B'){
						maxm++;
						break;
					}else{
						break;
					}
				}
				while(rr+2<n){
					if(s[rr+1]=='B'&&s[rr+2]=='T'){
						rr+=2;
					}else if(s[rr+1]=='T'&&s[rr+2]=='B'){
						maxm++;
						break;
					}else{
						break;
					}
				}
				maxx=max(maxx,maxm);
				if(maxx==2){
					printf("%d\n",maxn+2);
					break;
				}
			}else if(a[i].sum==maxn-1){
				maxm=0;
				ll=a[i].l,rr=a[i].r;
				while(ll-2>=0){
					if(s[ll-1]=='B'&&s[ll-2]=='T'){
						ll-=2;
					}else if(s[ll-1]=='T'&&s[ll-2]=='B'){
						maxm++;
						break;
					}else{
						break;
					}
				}
				while(rr+2<n){
					if(s[rr+1]=='B'&&s[rr+2]=='T'){
						rr+=2;
					}else if(s[rr+1]=='T'&&s[rr+2]=='B'){
						maxm++;
						break;
					}else{
						break;
					}
				}
				if(maxm==2){
					printf("%d\n",maxn+1);
					break;
				}
			}else if(a[i].sum<maxn-1){
				printf("%d\n",maxn);
				break;
			}
		}
	}
	return 0;
}
2024/10/23 21:50
加载中...