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;
}

  

 

posted @ 2015-01-24 17:37  Claris  阅读(172)  评论(0编辑  收藏  举报