RT,WA on #14,后面有的更大大数据都过了。
Wrong Answer.wrong answer On line 3 column 1, read 8, expected 7.
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x&-x)
using namespace std;
const int N=(1<<20)+5,tmp=131,P=1e9+7;
string s;
vector<int>L[N];
int n,m,T,c[N],p[26];
int suf[N],f[N],ans;
int pre[N],fp[N];
inline int get_hash(int l,int r)
{return (pre[r]+P-pre[l-1]*fp[r-l+1]%P)%P;}
inline int qry(int x,int res=0){
for(;x;x-=lowbit(x))res+=c[x];
return res;
}
inline void upd(int x,int k){
for(;x<=27;x+=lowbit(x))c[x]+=k;
}
inline void addqry(int l,int r){L[l].push_back(r);}
inline void init(){ans=0;
memset(c,0,sizeof c);
memset(p,0,sizeof p);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;fp[0]=1;
for(int i=1; i<N; ++i)
fp[i]=fp[i-1]*tmp%P;
while(T--){
cin>>s,n=s.size();s='*'+s;
for(int i=1; i<=n; ++i)
pre[i]=(pre[i-1]*tmp+s[i])%P;
for(int i=2; i<=n; ++i){
int res=get_hash(1,i);
for(int j=i+1; j<=n; j+=i){
addqry(i-1,j);
if(j+i>n||res!=get_hash(j,j+i-1))
break;
}
}
for(int i=n; i; --i){
++p[s[i]-'a'];
if(p[s[i]-'a']&1)suf[i]=suf[i+1]+1;
else suf[i]=suf[i+1]-1;
}
memset(p,0,sizeof p);
for(int l=1,sum=0; l<=n; ++l){
++p[s[l]-'a'];
if(p[s[l]-'a']&1)++sum;
else --sum;
upd(sum+1,1);
for(int r:L[l])
ans+=qry(suf[r]+1);
L[l].clear();
}
cout<<ans<<'\n';
init();
}
return 0;
}