萌新刚学OI ,求助莫队水题
查看原帖
萌新刚学OI ,求助莫队水题
247269
MSqwq楼主2021/4/2 00:38

啥都过了,但是一交上去就挂了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll g,q[60010]; 
char c;

struct qwq{
	ll x,y;
	ll id;
}a[60010];
bool cmp(qwq x,qwq y)
{
	if(x.x/g==y.x/g)
	{
		if((x.x/g)&1)return x.y<y.y;
		else return x.y>y.y;
	}
	else return x.x<y.x;
}

ll l=1,r,sum,ql,qr;
ll f[1<<27];
ll ans[60010];
void q1(ll x)
{
	sum+=f[q[x]];
	for(int i=0;i<=25;i++)sum+=f[q[x]^(1<<i)];
	f[q[x]]++;
}
void q2(ll x)
{
	f[q[x]]--;
	for(int i=0;i<=25;i++)sum-=f[q[x]^(1<<i)];
	sum-=f[q[x]];
}
int main()
{
	scanf("%lld%lld",&n,&m);
	g=sqrt(n);
	
	c=getchar();
	for(int i=1;i<=n;i++)
	{
		c=getchar();
		q[i]=q[i-1]^(1<<(c-'a'));
	}
	
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld",&a[i].x,&a[i].y);
		a[i].id=i;
	}
	
	sort(a+1,a+1+m,cmp);
	f[0]=1;
	for(int i=1;i<=m;i++)
	{
		ql=a[i].x;
		qr=a[i].y;
		while(r<qr)q1(++r);
		while(l>ql)q1(--l-1);
		while(l<ql)q2(l++-1);
		while(r>qr)q2(r--);
		ans[a[i].id]=sum;
	} 
	for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
}

2021/4/2 00:38
加载中...