首页 > 其他分享 >题解:AT_abc345_c [ABC345C] One Time Swap

题解:AT_abc345_c [ABC345C] One Time Swap

时间:2024-03-25 13:47:24浏览次数:26  
标签:int 题解 ll 枚举 long ABC345C abc345 ans fl

求过审

题面翻译

给定一个字符串 $ s $ ,求执行以下操作一次可以产生的字符串的个数

设 $ N $ 为 $ s $ 的长度。选择一对整数 $ (i,j) $ ,使 $ 1≤i<j≤N $ ,交换 $ s $ 的第 $ i $ 个和第 $ j $ 个字符

可以证明,在这个问题的约束条件下,你总是可以得到它

思路

暴力做法

我们可以暴力枚举 $ 1 \leq i < j \leq N $

若 $ s_i=s_j $ ,即交换后 $ s $ 不变,那么跳过

否则 $ ans $ 加 $ 1 $

注意:如果有重复字母,需要将 $ ans $ 加 $ 1 $

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
ll l,ans=0,f=0;
int main()
{
	ios::sync_with_stdio(0);//关闭流同步 
	cin>>s;
	l=s.size();
	s=' '+s;//巧妙地把第一位下标转成1
	for(int i=1;i<=l;i++)
	{
		for(int j=i+1;j<=l;j++)
		{
			if(s[i]!=s[j]) ans++;
			else f=1;
		}
	}
	cout<<ans+f;
	return 0;
}

提交后发现 $ TLE\ 13 $ 个点

优化

我们可以发现对于 $ s_i $

那么和其相等的 $ s_j $ 的个数可以通过后缀和统计

于是

for(int j=i+1;j<=l;j++)
{
	if(s[i]!=s[j]) ans++;
	else f=1;
}

这重循环可以变为

ans+=l-i+1sum[s[i]-'a'+1];
//这里是把a的下标看做1
//sum是后缀和

所以我们可以先求后缀和,然后计算

也可以倒着枚举,边计算边求

这里采用倒着枚举:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
ll f[1000100],a[100100],l,fl;
//fl记录是否有重复字母
int main()
{
	cin>>s;
	l=s.size();
	s=' '+s;
	a[s[l]-'a'+1]=1;
	f[l]=0;
	for(ll i=l-1;i>=1;--i)
	{
		a[s[i]-'a'+1]++;
		if(!fl&&a[s[i]-'a'+1]>1) fl=1;
		f[i]=l-i+1-a[s[i]-'a'+1];
	}
	for(ll i=1;i<=l;++i) f[0]+=f[i];
	cout<<f[0]+fl;
	return 0;
}

无关的话(审核大大不要计较):被禁言了,怎么解啊?

感谢观看

标签:int,题解,ll,枚举,long,ABC345C,abc345,ans,fl
From: https://www.cnblogs.com/whrwlx/p/18094192

相关文章

  • JavaScript:void(0) 用法及常见问题解析
    JavaScript:void(0)用法及常见问题解析javascript:void(0);是一种在JavaScript和网页开发中经常使用的技术,尤其在处理链接的行为时。本文将深入探讨javascript:void(0);的用法,以及在使用过程中可能遇到的常见问题和解决方法。什么是javascript:void(0);?javascript:v......
  • LeetCode第390场周赛题解(c++)
    真的无语了,早上怎么都提交不了,显示未知错误。。。结果晚上就可以提交了。唉100245.每个字符最多出现两次的最长子字符串给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的 最大 长度。示例1:输入: s="bcbbbcba"输出: 4解释:以......
  • [题解]HDU1024 Max Sum Plus Plus
    HDU1024这道题是一道很巧妙的\(dp\)题(虽然优化成一维,可是究其本质算不算二维\(dp\)?如果有明白的麻烦在评论说一下多谢),在上一篇文章——线性\(dp\)模型中也提到过,因为其前身其实就是上一篇写到的「最大连续子段和」。只不过这一题问的不是一段,而是\(m\)段,所以较上一题我们的选择......
  • AtCoder Beginner Contest 346 题解
    A-AdjacentProductQuestion给你\(N\)个整数\(A_1,A_2,\dots,A_N\)。同时,定义\(B_i=A_i\timesA_{i+1}\(1\leqi\leqN-1)\)按此顺序打印\(B_1,B_2,\dots,B_{N-1}\)Solution按照题意模拟Code#include<bits/stdc++.h>usingnamespacestd;intmain......
  • AT_abc344_D-String Bags 题解
    明显是DP。然后就开始分析:状态:\(dp_{ij}=\)有\(i\)个袋子且匹配\(T\)的前缀的长度为\(j\)时所需的最少钱数。匹配\(T\)的前缀的长度为\(j\)就是前\(j\)个字符与\(T\)的前\(j\)个字符相同。相对简单。然后看转移。为了方便,咱不妨令\(|S|\)为字符串\(S......
  • P10111 [GESP202312 七级] 纸牌游戏 题解
    看标签知道要用DP。于是开始分析。状态:$dp(i,j,k)=$前\(i\)轮中,第\(i\)轮出\(j\),一共换了\(k\)次牌的最大钱数。很好理解。转移也不难,不就是不换和换两种吗!所以,转移就是:\[dp(i,j,k)=\max\begin{cases}dp(i-1,j,k)+\operatorname{pk}(j,c_i)\times......
  • [暴力题解系列]2023年蓝桥杯-整数删除(30分)
    这题暴力最多30分,但是30分也是分,做暴力的人不能贪心,拿到分就是赚了。​ 这题核心烦人点在于他数据分层断崖,就只有前3个点能做到稳过。用的思路就是链表,但不是用指针存的,而是用数组下标为标记存的,只是我觉得因为这样好写一些。链表方便修改左右连接位置,所以越到后面就越能省下查询......
  • 0318-0324题解
    成信大天梯赛L1-6二进制因为二进制是逢二进一,所以我们只要用cnt记录一下每一位上的数并给它加起来,然后cnt%2便是其和这一位上的数,注意要从右往左开始点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>pii;voidsolve(){stringa,b......
  • 广州大学第十八届ACM大学生程序设计竞赛(同步赛)——题解
    这套题我答的很失败。没有按照题目的难度去答题,前期浪费了不少时间。题目:A-字符画题解:思维、模拟。这道题我的通过率为62.5,没有过的原因是因为对细节的处理和把控不到位,对一些点忽视,我也记录了搜索的过程,但没有把搜索过的点消掉,而且没有找到最好的顺序去解答这道题,我是按照横的......
  • 字母迷宫题解
    思路:看到这题一眼跑广搜,但是转眼天堂之门,欸为什么要加2?好像没法广搜(不满足广搜特性),咋办?凉拌。该怎么让它满足广搜特性(先搜到的是最优的)。欸,我们是不是可以将队列换成优先队列让先搜到的最优。好像是的欸,优先队列启动!代码:#include<bits/stdc++.h>usingnamespacestd;inta......