为啥只有三十分,求大佬改错(字典树+树状数组)
查看原帖
为啥只有三十分,求大佬改错(字典树+树状数组)
181715
gjh303987897楼主2022/1/12 21:30
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long n,a[1000001];
long long ans=0;
long long c[1000001];
struct data{
    int son[30];
    bool flag;
    int sign;
}t[800000];
long long num=0;
void build(char *s,int px){
    int len=strlen(s); int begin=0;
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(!t[begin].son[x]) t[begin].son[x]=++num;
        begin=t[begin].son[x];
    }
    t[begin].flag=true; t[begin].sign=px;
}
int check(char *s){
    int len=strlen(s); int begin=0;
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        begin=t[begin].son[x];
    }
    return t[begin].sign;
}
int lowbit(int x){
    return x&(-x);
}
void update(int x,int y){//add y to x
   for( ;x<=n;x+=lowbit(x)) c[x]+=y;
}
int sum(int x){
    int result=0;
    for(;x;x-=lowbit(x)) result+=c[x];
    return result;
}

int main()
{
    scanf("%lld",&n); char s1[10],s2[10];
    for(int i=1;i<=n;i++){
        cin>>s1; build(s1,i);
    }
    for(int i=1;i<=n;i++){
        cin>>s2; a[i]=check(s2);
    }
    for(int i=1;i<=n;i++){
        update(a[i],1); ans+=i-sum(a[i]);
    }
    printf("%lld",ans);
    return 0;
}
2022/1/12 21:30
加载中...