这种题目肯定是先把一个当做标准串
根据标准串得出一个初始串是怎么排列的,然后求逆序对数就可以了
但是因为有重复,我们不知道标准串中的一个数到底是由原来哪个字母交换来的
但是我们可以猜,不难贪心得到
对于标准串中某一个字符,它第一次出现的位置是有原串第一次出现的位置交换来的,
第二次是第二次,以此类推……
虽然不知道怎么证明但感觉就是对的
1 var c:array[0..1000010] of longint; 2 b:array[1..26] of longint; 3 q:array[1..26,0..1000000] of longint; 4 i,x,n:longint; 5 ans:int64; 6 ch:char; 7 8 function lowbit(x:longint):longint; 9 begin 10 exit(x and (-x)); 11 end; 12 13 procedure add(x:longint); 14 begin 15 while x<=n do 16 begin 17 inc(c[x]); 18 x:=x+lowbit(x); 19 end; 20 end; 21 22 function ask(x:longint):int64; 23 begin 24 ask:=0; 25 while x>0 do 26 begin 27 ask:=ask+c[x]; 28 x:=x-lowbit(x); 29 end; 30 end; 31 32 begin 33 readln(n); 34 for i:=1 to n do 35 begin 36 read(ch); 37 x:=ord(ch)-64; 38 inc(b[x]); 39 q[x,b[x]]:=i; 40 end; 41 readln; 42 fillchar(b,sizeof(b),0); 43 for i:=1 to n do 44 begin 45 read(ch); 46 x:=ord(ch)-64; 47 inc(b[x]); 48 x:=q[x,b[x]]; 49 ans:=ans+ask(n)-ask(x-1); 50 add(x); 51 end; 52 writeln(ans); 53 end.