68pts求调
查看原帖
68pts求调
399475
_XHY20180718_楼主2024/2/29 13:44

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;
}
2024/2/29 13:44
加载中...