RT,这样写就时0pts
string s;
getline(cin,s);
这样就AC了
string s;
cin>>s;
这两种写法有啥区别啊QAQ
附完整代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 6e+4+100;
struct Node{
int l,r,id;
};
int n,m,siz;
int l=1,r=0;
int a[maxn],block[maxn],pre[maxn];
Node q[maxn];
int res,cnt[(1<<26)+100],ans[maxn];
int read(){
int v=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f = -f; ch=getchar();}
while(ch>='0'&&ch<='9'){v=(v<<3)+(v<<1)+ch-48;ch=getchar();}
return v*f;
}
bool cmp(Node x,Node y){
return block[x.l]==block[y.l]?x.r<y.r:block[x.l]<block[y.l];
}
void init(){
string s;
cin>>s;
for(int i=1;i<=s.size();++i){
a[i] = s[i-1] - 65;
pre[i] = pre[i-1] ^ (1<<a[i]);
block[i] = (i-1)/siz +1;
}
return ;
}
void Add(int x){
res += cnt[pre[x]];
for(int i=0;i<26;++i) res+=cnt[pre[x]^(1<<i)];
cnt[pre[x]]++;
}
void Sub(int x){
cnt[pre[x]]--;
res-=cnt[pre[x]];
for(int i=0;i<26;++i) res-=cnt[pre[x]^(1<<i)];
}
int main(){
n=read();m=read();
siz = 3*sqrt(n);
init();
for(int i=1;i<=m;++i){
q[i].l=read()-1;q[i].r=read();
q[i].id = i;
}
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;++i){
Node t = q[i];
while(t.l<l) Add(--l);
while(t.l>l) Sub(l++);
while(t.r<r) Sub(r--);
while(t.r>r) Add(++r);
ans[t.id] = res;
}
for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
return 0;
}