用前缀和有错吗??
查看原帖
用前缀和有错吗??
137723
pencil楼主2022/1/7 13:27
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long int ll;
ll pre1[1000010],pre2[1000010],wz[1000010];
//ll  read(){
//	char a=getchar();
//	ll qwq=0;
//	while(a<'0'||a>'9'){
//		a=getchar();
//	}
//	while(a>='0'&&a<='9'){
//		qwq*=10;
//		qwq+=a-'0';
//		a=getchar();
//	}
//	return qwq;
//}
int cun[6];
int main() {
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	int n;
	cin>>n;
	char in;
	scanf("%c",&in);
	for(int i=1; i<=n; i++) {
		in=getchar();
		wz[i]=(in=='G'?1:2);
		int cz;
		if(in=='G')
			cz=1;
		if(in=='H')
			cz=0;
		pre1[i]=pre1[i-1]+cz;
		pre2[i]=pre2[i-1]+(cz^1);
	}
	ll sum=0;
	for(ll i=1; i<=n-2; i++) {
//		ll end=i+2;
		ll r=n,l=i;
		while(l<r&&r-l>1) {
			if(pre1[r]-pre1[l-1]==1||pre2[r]-pre2[l-1]==1) {
				sum+=r-l-1;
				break;
			}
			int mid=(l+r)>>1;
			if(pre1[mid]-pre1[l-1]>1||pre2[mid]-pre2[l-1]>1) {
				r=mid;
			} else {
//				if(pre1[mid]-pre1[l-1]==1||pre2[mid]-pre2[l-1]==1) {
//					sum+=mid-l-1;
//					break;
//				} else {
				l=mid;
//				}
			}

		}
//		while((pre1[end]-pre1[i-1]==1||pre2[end]-pre2[i-1]==1)&&end<=n){
//			sum++;
//			end++;
//		}

	}
	cout<<sum;
	return 0;
}

2022/1/7 13:27
加载中...