[bzoj2789] [Poi2012]Letters

Posted czllgzmzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj2789] [Poi2012]Letters相关的知识,希望对你有一定的参考价值。

  结论是..把A串中的字符挪到B串里最近的出现这个字符的地方就能最优了。。。

  求出A串中的每个位置上的字符,之后要挪到哪个位置。然后求一波逆序对就是答案了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 #define d double
 7 using namespace std;
 8 const int maxn=1000023;
 9 int pos[26][maxn],t[maxn];
10 int num[26],top[26];
11 int i,j,k,n,m;
12 ll ans;
13 char s1[maxn],s2[maxn];
14  
15 int ra,fh;char rx;
16 inline int read(){
17     rx=getchar(),ra=0,fh=1;
18     while((rx<\'0\'||rx>\'9\')&&rx!=\'-\')rx=getchar();
19     if(rx==\'-\')fh=-1,rx=getchar();
20     while(rx>=\'0\'&&rx<=\'9\')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
21 }
22 inline void add(int x){while(x<=n)t[x]++,x+=x&-x;}
23 inline int get(int x){int sm=0;while(x)sm+=t[x],x-=x&-x;return sm;}
24  
25 int main(){
26     n=read(),scanf("%s%s",s1+1,s2+1);char x;int p;
27     for(i=1;i<=n;i++)x=s2[i]-\'A\',pos[x][++num[x]]=i;
28     for(i=1;i<=n;i++)
29         x=s1[i]-\'A\',p=pos[x][++top[x]],
30         ans+=i-1-get(p),add(p);
31     printf("%lld\\n",ans);
32 }
View Code

 

以上是关于[bzoj2789] [Poi2012]Letters的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2789[Poi2012]Letters 树状数组

[bzoj2789] [Poi2012]Letters

bzoj2789[Poi2012]Letters 树状数组求逆序对

BZOJ 2789 letters(树状数组)

bzoj2789 Letters 树状数组

[BZOJ2788][Poi2012]Festival