[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

 

posted @ 2016-07-05 20:12  czllgzmzl  阅读(152)  评论(0编辑  收藏  举报