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