[bzoj2789]Letters
2024-10-21 11:44:49
考虑A中第i次出现的j字符,最终位置一定是在B中第i次出现的j字符的位置,然后即求逆序对数量,cdq/线段树即可
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 int n,a[N],c[N],nex[N],f[N<<2];
8 long long ans;
9 char s[N];
10 void update(int k,int l,int r,int x){
11 if (l==r){
12 f[k]++;
13 return;
14 }
15 if (x<=mid)update(L,l,mid,x);
16 else update(R,mid+1,r,x);
17 f[k]=f[L]+f[R];
18 }
19 int query(int k,int l,int r,int x,int y){
20 if ((l>y)||(x>r))return 0;
21 if ((x<=l)&&(r<=y))return f[k];
22 return query(L,l,mid,x,y)+query(R,mid+1,r,x,y);
23 }
24 int main(){
25 scanf("%d%s",&n,s);
26 memset(c,-1,sizeof(c));
27 for(int i=n-1;i>=0;i--){
28 nex[i]=c[s[i]-'A'];
29 c[s[i]-'A']=i;
30 }
31 scanf("%s",s);
32 for(int i=0;i<n;i++){
33 a[c[s[i]-'A']]=i;
34 c[s[i]-'A']=nex[c[s[i]-'A']];
35 }
36 for(int i=0;i<n;i++){
37 ans+=query(1,0,n-1,a[i],n-1);
38 update(1,0,n-1,a[i]);
39 }
40 printf("%lld",ans);
41 }
最新文章
- 图解集合5:不正确地使用HashMap引发死循环及元素丢失
- 从零开始,做一个NodeJS博客(二):实现首页-加载文章列表和详情
- Linux双机信任,适用统一安装
- SQL Server 2008 数据库通过镜像同步备份(数据库热备)
- BZOJ2463 谁能赢呢?
- Sql server之路 (二)登录本地服务器
- 【EF Code First】 一对多、多对多的多重关系配置
- 九章lintcode作业题
- char与varchar、nvarchar区别
- ios学习基础篇一
- JavaScript中的文档模式和严格模式
- Python中使用hashlib进行加密的简单使用
- centos通过yum安装mysql
- 一个简单的案例带你入门Dubbo分布式框架
- EJS-初识
- 【hihocoder 1424】 Asa&#39;s Chess Problem(有源汇上下界网络流)
- 【分布式搜索引擎】Elasticsearch如何部署以及优化查询性能
- tp5阿里云短信发送
- oracle 导出表
- part1:12-sudo用户管理和Linux密码故障排除