[BZOJ2789][Poi2012]Letters(树状数组求逆序对)

来源:互联网 发布:windows 2012 kms激活 编辑:程序博客网 时间:2024/05/17 01:12

题目描述

传送门

题解

预处理之后求逆序对。

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define LL long longconst int max_n=1e6+5;char a[max_n],b[max_n];int n,last[100],next[max_n],st[100],bit[max_n];LL C[max_n],ans=0;inline void add(int loc,int val){    for (int i=loc;i<=n;i+=i&(-i)) C[i]+=val;}inline int query(int loc){    int ans=0;    for (int i=loc;i>=1;i-=i&(-i)) ans+=C[i];    return ans;}int main(){    scanf("%d\n",&n);    gets(a); gets(b);    for (int i=0;i<n;++i) next[i]=n;    memset(last,-1,sizeof(last));    for (int i=0;i<n;++i){        if (last[a[i]]!=-1) next[last[a[i]]]=i;        else st[a[i]]=i;        last[a[i]]=i;    }    for (int i=0;i<n;++i){        bit[i+1]=st[b[i]]+1;        st[b[i]]=next[st[b[i]]];    }    for (int i=n;i>=1;--i){        ans+=query(bit[i]);        add(bit[i],1);    }    printf("%lld\n",ans);}
0 0