首页 > 其他分享 >C - Word Ladder (Toyota Programming Contest 2024#9 (AtCoder Beginner Contest 370))

C - Word Ladder (Toyota Programming Contest 2024#9 (AtCoder Beginner Contest 370))

时间:2024-10-18 19:51:40浏览次数:3  
标签:AtCoder Word cout Contest int 字母 cin 更换 define

题目链接:C - Word Ladder

题目:

样例:

分析:

不要被题目所吓到,一切长题目都是纸老虎。题目大意就是给你两个字符串s和t,一次只能更换一个字母,求s变到t更换的次数,并输出每次更换一个字母后的最小字典序字符串。题意好理解,可以直接暴力,大力出奇迹。但是有没有更好的方法呢?既然问了就说明是有的。最主要的是要搞清每次更换的是哪个字母。我们可以先考虑特殊情况,假设s中的每个字母都是大于等于t中对应的那个字母,如:s=bbb,t=aaa。第一次s=bbb更换有三种情况:abb bab bba 最小的那个是abb。第二次s=abb更换有两种:aab aba 最小的那个是aab。第三次s=aab可直接更换为t=aaa。可看出当s>=t时更换的次序是从左到右依次更换的。同理可知当s中的每个字母都是小于等于t中对应的那个字母时更换的次序是从右到左依次更换的。由特殊到一般,s中字母既有大于还有小于t中对应的字母时,如样例中:s=afwgebrw,t=oarbrenq。s中字母大于t中相应位置的下标为:12367,小于的为:045。而s到t更换的次序为:12367 540,首先是大于的从左往右,然后是小于的从右往左。知道这就好做了。我们可以用一个动态数组记录每次要改变字母的位置,然后改变就好了。当然也可以用双向队列deque来做,从后往前扫描,s中哪个字母>t中对应的字母是时插入队列的头部,小于时插入队列的尾部,这一套下来后可也得出大于的是从左往右的,小于的是从右往左的。话不多说直接上 code

GAME OVER!!!

END!

方法一:直接暴力 

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;

vector<string>ans;
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	string s, t;
	int k; //s和t中不同的字母个数   
	cin >> s >> t;
	int n = s.size();
	while(s != t) {
		k ++;
		string idx(n, 'z');
		for(int i = 0; i < n; i++ ) {
			if(s[i] != t[i]) {
				string tmp = s;
				tmp[i] = t[i];
				idx = min(idx,tmp); //得到字典序最小的那个字符串 
			}
		}
		ans.push_back(idx);         //把每次最小的字符串加入到答案数组中 
		s = idx;                    //把这次修改后的字符串赋值给s 
	}
	cout << k << endl;
	for(auto i : ans)
		cout << i << endl;
	return 0;
}

方法二:记录位置

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	string s, t;
	cin >> s >> t;
	vector<string> ans;
	vector<int> x; //存要改变字母的下标 
	int n = s.size();
	for(int i = 0; i < n; i++ ) {//大于 从左往右 
		if(s[i] > t[i]) x.push_back(i);
	}
	for(int i = n - 1; i >= 0; i-- ) {//小于 从右往左 
		if(s[i] < t[i]) x.push_back(i);
	}
	int k = x.size(); 
	
	for(int i = 0;i < k; i++ ) {
		s[x[i]] = t[x[i]];
		ans.push_back(s);
	}
	cout << k << endl;
	for(auto i : ans) cout << i << endl; 
	return 0;
}

方法三:deque

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	string s, t;
	cin >> s >> t;
	deque<int> x;
	for(int i = s.size() - 1; i >= 0; i --) {//队列从后往前扫描 
		if(s[i] > t[i]) x.push_front(i);     //大于的插入头部 
		if(s[i] < t[i]) x.push_back(i);      //小于的插入尾部 
	}
	int k = x.size();
	cout << k << endl;
	for(auto i : x) {
		s[i] = t[i];
		cout << s << endl;
	}
	return 0;
}

标签:AtCoder,Word,cout,Contest,int,字母,cin,更换,define
From: https://blog.csdn.net/Jeraphael/article/details/142966139

相关文章

  • 【软件资料】数据库设计规范,数据库设计说明书,数据库设计规范,数据库文档(Word资料下载)
     1编写目的2数据库策略2.1数据库对象长度策略2.2数据完整性策略2.3规范化设计与性能之间的权衡策略2.4字段类型的定义与使用策略3命名规范3.1数据库命名规则3.2数据库对象命名的一般原则3.3表空间(Tablespace)命名规则3.4表(Table)命名规则3.5字段命......
  • 适用于 Windows 10 / 11 的 5 个最佳免费 PDF 转 Word 转换器
     PDF转Word转换器PDF文件是共享文档的首选格式,但是,此类文件存在限制,因此难以修改或编辑。因此,您可能会发现自己正在寻找一种将PDF文件转换为Word或其他可编辑格式的方法。市面上有许多不同的PDF转换器,每一种都提供略有不同的功能。本文将介绍您可能需要PDF转换......
  • 358G AtCoder Tour
    358G思维题#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intn,m,s,t,vis[55][55][2505],k;lldis[55][55][2505],v[55][55],ans;intmvx[]={-1,1,0,0};intmvy[]={0,0,-1,1};structNode{intx,y,d;};queue<Node>q;void......
  • 手机pdf转word软件有哪些?分享几种好用手机、电脑转换软件
    在日常工作和学习中,我们经常需要将PDF文件转换为Word文档以便于编辑和修改。有的小伙伴身边有电脑,而有的小伙伴手上只有手机,那怎么在手机上将PDF转换成Word呢?下面给大家分享几种PDF转换Word方法软件,手机、电脑都有,一起来看看吧。软件一:迅捷PDF转换器App这是一款功能强大的PD......
  • IEEE全文导入飞书/Word
    IEEE网站右击切换到PlainSource然后公式显示为latex代码加上$$格式F12打开控制台,输入神秘代码(见附件)最终IEEE网站显示效果直接复制到飞书效果:使用沉浸式翻译将IEEE网站翻译成中文:复制到飞书:生成word生成word效果从IEEE复制MathMLCode替换word中无法......
  • The 2024 CCPC National Invitational Contest (Northeast) ADEJ
    The2024CCPCNationalInvitationalContest(Northeast)ADEJA.PaperWatering思路:有两种类型的操作,对一个数开根号或平方。平方没有什么问题,开根号由于是向下取整再平方就会产生不一样的数。那么做法也很简单了。对于一个数\(x\),\(k\)步,首先它能平方往后变\(k\)步,往前能......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开 word文件动态插入图片并设置
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如......
  • word 2013首页不显示页码,首页显示总页数设置方法
    在Word2013中,设置首页显示“共多少页”的页码信息,可以通过以下步骤来实现:一、插入页码打开Word2013文档,确保文档处于编辑状态。点击顶部菜单栏中的“插入”选项卡。在“页眉和页脚”组中,点击“页码”按钮。从下拉菜单中选择页码的位置(如页面底端)和样式(如“普通数字2”)。......
  • Codeforces Beta Round 93 (Div. 1 Only) B. Password 一题三吃
    https://codeforces.com/problemset/problem/126/B学完Z函数,先用哈希做了一遍,再用Z函数做了一遍,然后搜其他人的题解发现用next数组也能做,就又做了一遍B.Password题意给一串字符串\(s\),要求找一个最长的\(t\)\(t\)既是\(s\)的前缀串,也是后缀串,还是除了前缀后缀外的一个......
  • PDF秒变Word,你的文档编辑从此开挂!
    在现代办公中,PDF和Word是我们最常接触的两种文件格式。PDF因其良好的兼容性和固定的格式而广受欢迎,但在编辑时却常常让人感到束手无策。而Word则因其强大的编辑功能成为文档处理的首选。那么,如何将PDF转化为Word,让文档编辑更加顺畅呢?使用工具1.打开浏览器,进入工具箱官网。......