恩、、蒟蒻只会写沙茶题了。。。唔~
这道题首先想到了逆序对,但是每个字母有多个们怎么办呢。。。
欸,对哦,必须是最近两个相同字母的进行配对,然后就可以搞出一个数列来了。。。
然后就没有然后了!(去年逆序对写错的蒟蒻不想再说逆序对的问题了。。。)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /************************************************************** 2 Problem: 2789 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:1060 ms 7 Memory:8704 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <cstring> 12 #include <queue> 13 14 #define lowbit(x) x & -x 15 using namespace std; 16 const int N = 1000005; 17 int n; 18 int val, BIT[N]; 19 long long ans; 20 queue <int> q[26]; 21 22 int read() { 23 char ch = getchar(); 24 while (ch < 'A' || 'Z' < ch) 25 ch = getchar(); 26 return ch - 'A'; 27 } 28 29 void add(int x) { 30 while (x <= n) 31 ++BIT[x], x += lowbit(x); 32 } 33 34 int query(int x) { 35 int res = 0; 36 while (x) 37 res += BIT[x], x -= lowbit(x); 38 return res; 39 } 40 41 int main() { 42 scanf("%d", &n); 43 int i, t; 44 for (i = 1; i <= n; ++i) 45 q[t = read()].push(i); 46 for (i = 1; i <= n; ++i) { 47 t = read(); 48 val = q[t].front(); 49 q[t].pop(); 50 ans += query(n) - query(val); 51 add(val); 52 } 53 printf("%lld\n", ans); 54 return 0; 55 }