BZOJ2789 : [Poi2012]Letters

按照顺序依次找到b串每个字母最后的位置,然后求逆序对。

 

#include<cstdio>

#define N 1000010

int n,i,j,k,g[26],nxt[N],bit[N];char a[N],b[N];long long ans;

int main(){

  for(scanf("%d",&n),gets(a),gets(a+1),gets(b+1),i=1;i<=n;g[a[i]]=i++)nxt[i]=g[a[i]-='A'];

  for(i=n;i;i--){

    for(k=j=g[b[i]-='A'],g[b[i]]=nxt[g[b[i]]];k;k-=k&-k)ans+=bit[k];

    for(;j<=n;j+=j&-j)bit[j]++;

  }

  return printf("%lld",ans),0;

}

  

 

你可能感兴趣的:(2012)