D. 字母 Letters
内存限制:256 MiB
时间限制:500 ms
标准输入输出
题目类型:传统
评测方式:文本比较

题目描述

给定两个长度相同且由大写英文字母组成的字符串 A 和 B,保证 A 和 B 中每种字母出现的次数相同。

每次可以交换 A 中相邻两个字符,求最少需要交换多少次可以使得 A 变成 B。

输入格式
第一行一个正整数 ,表示字符串的长度。

第二行和第三行各一个长度为 的字符串,并且只包含大写英文字母。

输出格式
一个非负整数,表示最少的交换次数。

样例
样例输入
3
ABC
BCA
样例输出
2
数据范围与提示
对于 的数据保证 .

对于所有数据保证 .

Task author: Marian M. Kedzierski.

题目分析

1.首先有一种很明显的思路:按照a,或b,其中一个为基准,把另一个字符串的值改为他的顺序,然后就是简单的逆序对

scanf("%s", s + 1);
scanf("%s", b + 1);
for (int i = 1; i <= n; i++) {
val[b[i]] = i;
}
for (int i = 1; i <= n; i++) {
a[i] = val[s[i]];
}

不过,类似AABB ABAB就行不通了

2.这里有一个贪心的思路:就近原则
简单来说就是,不能将相同字符设为同一个值,谁更近,他的价值就越大,也就是值越小
3.于是,这道题的难点就是在初始化,利用ASCLL码,以及只有大写字母

for(int i=1;i<=n;i++)
{
jl[i]=p[s[i]-'A'+1];
p[s[i]-'A'+1]=i;
}
for(int i=n;i>=1;i--)
{
a[i]=p[b[i]-'A'+1];
p[b[i]-'A'+1]=jl[p[b[i]-'A'+1]];
}
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long int n, m;
char s[10000005];
char b[10000005];
long long val[100005];
long long int a[1000005];
long long int lsh[1000005];
long long int Bit[1000005];
bool flag[10000005];
long long p[10000005];
long long jl[10000005];
long long int pd, l, r, x;
long long int cnt;
long long int ans1;
long long int ans2;
long long int lowbit(long long x) { return x & (-x); }
void update(long long k, long long x) {
for (int i = k; i <= n; i += lowbit(i)) {
Bit[i] += x;
}
}
long long Sum(long long k) {
long long ans = 0;
for (int i = k; i >= 1; i -= lowbit(i)) {
ans += Bit[i];
}
return ans;
}
void read(long long &x)
{
int f=1;
x=0;
char s=getchar();
while(s<'0'||s>'9')
{
if(s=='-')
{
f=-1;
}
s=getchar();
}
while(s>='0'&&s<='9')
{
x=x*10+(s-48);
s=getchar();
}
x*=f;
} int main() {
read(n);
scanf("%s",s+1);
scanf("%s",b+1);
for(int i=1;i<=n;i++)
{
jl[i]=p[s[i]-'A'+1];
p[s[i]-'A'+1]=i;
}
for(int i=n;i>=1;i--)
{
a[i]=p[b[i]-'A'+1];
p[b[i]-'A'+1]=jl[p[b[i]-'A'+1]];
}
for (int i = 1; i <= n; i++) {
update(a[i], 1);
ans1+=i - Sum(a[i]);
}
printf("%lld", ans1);
}

字母 Letters的更多相关文章

  1. (2)apply函数及其源码

      本文原创,转载请注明出处,本人Q1273314690(交流学习) 总结: 就是MARGIN决定了你的FUN调用几次,每次传递给你的是什么维度的内容,而...是传递给FUN的(每次调用的时候都会被传 ...

  2. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  3. 你真的用好了Python的random模块吗?

    random模块 用于生成伪随机数 源码位置: Lib/random.py(看看就好,千万别随便修改) 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结 ...

  4. Agens层次聚类

    层次聚类是另一种主要的聚类方法,它具有一些十分必要的特性使得它成为广泛应用的聚类方法.它生成一系列嵌套的聚类树来完成聚类.单点聚类处在树的最底层,在树的顶层有一个根节点聚类.根节点聚类覆盖了全部的所有 ...

  5. fastadmin表单验证

    Unexpected token < in JSON at position 0 注意: if (!form.is("form"))//form的选择器不是form直接返回所 ...

  6. Python练手例子(3)

    13.打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...

  7. R语言系列:生成数据

    R语言系列:生成数据 (2014-05-04 17:41:57) 转载▼ 标签: r语言 教育 分类: 生物信息 生成规则数据1.使用“:“,如x=1:10,注意该方法既可以递增也可以递减,如y=10 ...

  8. C 标准库 - ctype.h

    C 标准库 - ctype.h This header declares a set of functions to classify and transform individual charact ...

  9. python3基础06(随机数的使用)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import osimport randomimport string la=[0,1,2,3,4,5,6,7, ...

随机推荐

  1. 找出1小时内占用cpu最多的10个进程的shell脚本

    cpu时间是一项重要的资源,有时,我们需要跟踪某个时间内占用cpu周期最多的进程.在普通的桌面系统或膝上系统中,cpu处于高负荷状态也许不会引发什么问题.但对于需要处理大量请求的服务器来讲,cpu是极 ...

  2. Redis,Memcache,MongoDb的特点与区别

    Redis Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支 ...

  3. jQuery - 的几种删除方法,还有他们的区别

    1.empty() 清空节点,它能清空元素中的所有后代节点,不能删除自己本身这个节点 2.remove() 该节点与该节点所包含的所有后代节点将同时被删除,提供传递一个筛选的表达式,删除指定合集中的元 ...

  4. 【C#】【MySQL】【GridView】删除出现Parameter index is out of range

    [编程语言]C# [数据库]MySQL [控件]GridView [问题描述]GridView控件中自带[删除],[编辑],[选择],三个按钮[编辑],[选择]正常使用,但是在使用删除时,却报错Par ...

  5. [BUUCTF]PWN——bjdctf_2020_babyrop2

    bjdctf_2020_babyrop2 附件 步骤: 例行检查,64位程序,开启了NX和canary保护 2. 试运行一下程序,看看大概的情况 提示我们去泄露libc 3. 64位ida载入,从ma ...

  6. [BUUCTF]PWN——bjdctf_2020_babystack2

    bjdctf_2020_babystack2 附件 步骤: 例行检查,64位程序,开启了nx保护 尝试运行一下程序,看看情况 64位ida载入,习惯性的先检索程序里的字符串,发现了bin/sh,双击跟 ...

  7. JavaFx Tooltip悬浮提示使用及自定义

    原文:JavaFx Tooltip悬浮提示使用及自定义 | Stars-One的杂货小窝 本篇是基于TornadoFx框架对Tooltip组件进行讲解,使用Kotlin语言,和传统Java使用有所区别 ...

  8. UVA10976 分数拆分 Fractions Again?! 题解

    Content 给定正整数 \(k\),找到所有的正整数 \(x \geqslant y\),使得 \(\frac{1}{k}=\frac{1}{x}+\frac{1}{y}\). 数据范围:\(0& ...

  9. Vue3.0是如何变快的

    1.diff算法优化 + Vue2中的虚拟dom是进行全量的对比 https://vue-next-template-explorer.netlify.app/ + Vue3新增了静态标记(Patch ...

  10. Shell之awk常用用法