神奇RE求助
查看原帖
神奇RE求助
409518
Zzz_yigui楼主2023/11/13 15:16

此程序在开启O2情况下RE #26 WA #22 而不开启O2情况下RE #23#24#25#26 WA#22

#include<bits/stdc++.h>
using namespace std;
string st;
int t,f[(1<<20)+10][30],b[(1<<20)+10],zt,n,l,tt;
unsigned long long sm[(1<<20)+10],tp,ans;

int main(){
	cin>>t;
	while(t--){	
 		cin>>st;
 		//scanf(" %s",&st);
 		//cout<<1;
 		l=st.size();
 		//cout<<l;
		//for(int i=0;i<l;i++)cout<<st[i];
		//cout<<endl;
 		ans=0;
 		for(int i=0;i<=26;i++)f[0][i]=0;
		n=1;
		zt=1<<(st[0]-'a');
		for(int i=n;i<=26;i++)f[0][i]++;
 		for(int i=1;i<l;i++){
 			tt=st[i]-'a';
			if(!(zt&(1<<tt))) n++;
			else n--;
			zt=zt^(1<<tt);
			for(int j=0;j<=26;j++)f[i][j]=f[i-1][j];
			for(int j=n;j<=26;j++)f[i][j]++;
		 }
		 /*
		 for(int i=0;i<l;i++){
		 	for(int j=0;j<=5;j++){
		 		cout<<f[i][j]<<" ";
			 }
			 cout<<endl;
		 }*/
		zt=0;
		n=0;
		for(int i=l-1;i>=0;i--){
			tt=st[i]-'a';
			if(!(zt&(1<<tt))) n++;
			else n--;
			zt=zt^(1<<tt);
			b[i]=n;
		}
		b[l]=-1;
		/*
		for(int i=0;i<l;i++)cout<<b[i]<<" ";
		cout<<endl;*/
		sm[0]=st[0]-'a';
		for(int i=1;i<l;i++){
			sm[i]=sm[i-1]*131+(st[i]-'a');
		}
		tp=131;
		for(int i=2;i<=l-1;i++){
			tp*=131;
			ans+=f[i-2][b[i]];
		 	tt=1;
			while(sm[i-1]==(sm[i*(tt+1)-1]-sm[i*tt-1]*tp)&&tt*i<l){
				tt++;
		 		ans+=f[i-2][b[tt*i]];
			}
		 	
		}
		cout<<ans<<endl;
	}
	return 0;
}
2023/11/13 15:16
加载中...