A Adjacent Swapping

题意:

给定一个字符串,每次可以移动相邻字符,求最小移动次数可以把它变成s+s这样左右两边相同的字符串。

思路:

1:我们知道他一定是偶数长度,所以我们把字符串分成两部分s1和s2

2:贪心的扫描一遍这个字符串,s1就是前一半,然后计算在满足这一般的时候他要移动多少次,即直接往前移动就可以了

len = i-s1.size()

3:此时的s2就是剩下的数组,我们需要把s2变成s1,所以也就是求s2变成s1需要多少步,求步数这个思想类似于冒泡排序

4:我们根据冒泡排序的性质:对于任意两个数看他是否逆序即大数在前小数在后如果逆序则进行交换次数+1,那么我们就可以根据这个性质求出s2到s1通过树状数组或归并排序求逆序对求出步数

点击查看代码
#include <bits/stdc++.h>

using namespace std;
#define int long long
map<char,int>mp;
queue<int>q[30];
const int N = 1e6 + 10;
int d[N];
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
for(;x<= N;x += lowbit(x))
d[x]++;
}
int query(int x)
{
int res = 0;
for(;x;x-=lowbit(x))
res += d[x];
return res;
}
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
for(int i = 0;i < n;i ++)
{
mp[s[i]] ++;
} for(auto [l,r]:mp)
{
mp[l] = r/2;
} string s1,s2;
int ans = 0;
for(int i = 0;i < n;i ++)
{
if(mp[s[i]]!=0)
s2+=s[i],mp[s[i]]--,ans += i+1-s2.size();
else
s1 += s[i];
}
for(int i = 0;i < s2.size();i ++)
{
q[s2[i]-'a'].push(i);
}
vector<int>num;
for(int i = 0;i < s1.size();i ++)
{
num.push_back(q[s1[i]-'a'].front());
q[s1[i]-'a'].pop();
}
for(int i = 0;i < num.size();i ++)
{
ans += query(n/2)-query(num[i]+1);
add(num[i]+1);
}
cout << ans << '\n';
}
signed main()
{
solve();
}

2022年第十四届四川省大学生程序设计大赛 A的更多相关文章

  1. CISCN2021-第十四届全国大学生信息安全竞赛-WriteUp

    WriteUp - Maple_root -CISCN2021 总结 总得分:3400 总排名:203 赛区排名:21 第一次认真参加正式的CTF,24+3小时的脑血栓比赛时长,收获还是很多的. 开卷 ...

  2. 第十四届华中科技大学程序设计竞赛 C Professional Manager【并查集删除/虚点】

    题目描述 It's universally acknowledged that there're innumerable trees in the campus of HUST. Thus a pro ...

  3. 第十四届中北大学ACM程序设计竞赛 J.ZBT的游戏

    问题描述 第14届中北大学程序设计竞赛来了,集训队新买了一大堆气球,气球一共有K种颜色(1<=K<=256),气球的颜色从1-K编号. ZBT童心未泯,他发明了一种摆放气球的游戏,规则如下 ...

  4. 第十四届华中科技大学程序设计竞赛决赛同步赛 A - Beauty of Trees

    A - Beauty of Trees 题意: 链接:https://www.nowcoder.com/acm/contest/119/A来源:牛客网 Beauty of Trees 时间限制:C/C ...

  5. 第十四届华中科技大学程序设计竞赛决赛同步赛 F Beautiful Land(01背包,背包体积超大时)

    链接:https://www.nowcoder.com/acm/contest/119/F来源:牛客网 Beautiful Land 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1 ...

  6. 第十四届华中科技大学程序设计竞赛 K Walking in the Forest【二分答案/最小化最大值】

    链接:https://www.nowcoder.com/acm/contest/106/K 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

  7. 第十四届华中科技大学程序设计竞赛 J Various Tree【数值型一维BFS/最小步数】

    链接:https://www.nowcoder.com/acm/contest/106/J 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

  8. 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】

    链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

  9. 第十四届华中科技大学程序设计竞赛决赛同步赛 Beautiful Land

    It’s universally acknowledged that there’re innumerable trees in the campus of HUST.Now HUST got a b ...

  10. 第十四届华中科技大学程序设计竞赛 K--Walking in the Forest

    链接:https://www.nowcoder.com/acm/contest/106/K来源:牛客网 题目描述 It’s universally acknowledged that there’re ...

随机推荐

  1. MySQL学习(四)锁机制

    分类 读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰 写锁(互斥锁):如果当前写操作没有完毕,则无法进行其他的读操作.写操作 操作范围 表锁:一次性对一张表整体加锁.如myisam存储 ...

  2. 解决class path resource [applicationContext.xml] cannot be opened because it does not exist

    在学习spring的过程出现class path resource [applicationContext.xml] cannot be opened because it does not exis ...

  3. 6.sql注入

    sql注入 目录 sql注入 1.SQL注入原理 2.如何判断注入点 联合注入 报错注入(有错误报出) 布尔盲注(不管输入什么,界面只会出现两种结果) 时间盲注(不管输入什么,界面都是一样的) 堆叠注 ...

  4. PHP微信三方平台-序章

    一 微信三方平台准备工作 参数说明: 1.登录授权的发起页域名:提供登录授权公众号的域名地址主开发地址 2.测试公众号列表:未全网发布之前只能添加测试公众号 3.授权事件后的接收URL: 这个地址只要 ...

  5. node-sass与node版本对照图

  6. 四月八号java基础

    1.复合语句:JAVA语言不允许在两个嵌套的复合语句内声明同样的变量 2.注释:1)单行注释// 2)多行注释/*......*/3)/**......*/文件注释 3.else总是与之最近的if结构 ...

  7. Spring入门系列:浅析知识点

    前言 讲解Spring之前,我们首先梳理下Spring有哪些知识点可以进行入手源码分析,比如: Spring IOC依赖注入 Spring AOP切面编程 Spring Bean的声明周期底层原理 S ...

  8. GIL和池的概念

    1.GIL概念 1. 什么是GIL(为Cpython解释器) GIL本身就是一把互斥锁. 原理都一样. 都是让并发的线程同一时间只能执行一个 所以有了GIL的存在. 同一进程下的多个线程同一时刻只能有 ...

  9. ChatGPT API接口编程基础与使用技巧

    总结/朱季谦 趁着这周末空闲时间,在研读完OpenAi官网文档的基础上,及时总结了这篇<ChatGPT API接口编程基础与使用技巧>. 本文大部分内容是围绕编程方面,包括ChatGPT模 ...

  10. javasec(六)RMI

    这篇文章介绍java-RMI远程方法调用机制. RMI全称是Remote Method Invocation,远程⽅法调⽤.是让某个Java虚拟机上的对象调⽤另⼀个Java虚拟机中对象上的⽅法,只不过 ...