字符串刷题(day1)题解

文章目录

    • 字符串刷题
      • 一、Erase First or Second Letter
      • 二、Swap and Reverse
      • 三、Largest Subsequence
      • 四、XOR Palindromes
      • 五、Strong Password
      • 六、Row Major
      • 七、Game with Reversing
      • 八、Tear It Apart

字符串刷题

vjudge题单

一、Erase First or Second Letter

[Erase First or Second Letter](Erase First or Second Letter - CodeForces 1917B - Virtual Judge (vjudge.net))

每个字符串可以看做由一个前缀字符和一个后缀字符串组合而成,不同长度的后缀字符串对答案的贡献是相同的,但是前面的字符是不同的,所以只用记录前面出现字符的种类即可。每次都加上前面的字符种类。

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;int main(){int t; cin>>t;while(t--){int n; cin>>n;string s; cin>>s;int ans=0,cnt=0;map<char,int> mp;for(int i=0;i<s.size();i++){ans+=cnt;if(mp[s[i]]==0) cnt++;mp[s[i]]++;}ans+=cnt; //后缀为空cout<<ans<<'\n';}
}

二、Swap and Reverse

[Swap and Reverse](Swap and Reverse - CodeForces 1864B - Virtual Judge (vjudge.net))

第一种操作只能奇数偶数下标的字符翻转,而如果第二种操作的k为偶数,那么可以做到奇偶下标字符的相互转换。若为奇数,则仍然只能奇数偶数下标内部翻转。

#include<iostream>
#include<algorithm>
using namespace std;
const int M=1e5+5;
char ch1[M],ch2[M];
int main(){int t; cin>>t;while(t--){int n,k; cin>>n>>k;string s; cin>>s;//s=" "+s;if(k%2==0){sort(s.begin(),s.end());cout<<s<<endl;continue;}s=" "+s;int cnt1=-1,cnt2=-1;for(int i=1;i<=n;i++){if(i%2){ch1[++cnt1]=s[i];}else{ch2[++cnt2]=s[i];}}sort(ch1,ch1+cnt1+1);sort(ch2,ch2+cnt2+1);int j=-1; int p=-1;for(int i=1;i<=n;i++){if(i%2){cout<<ch1[++j];}else{cout<<ch2[++p];}}cout<<endl;}
}

三、Largest Subsequence

[Largest Subsequence](Largest Subsequence - CodeForces 1905C - Virtual Judge (vjudge.net))

每次选取字典序最大的子序列,向右循环移动一次,最少多少次移动可以使整个字符串有序。观察得到,只要找到字典序最大的子序列以后,以后的每一次翻转都是基于这个子序列的子序列上面的。最少的反转次数就是字典序最大的字符后面的字符数量(每一次右移会有一个比最大字典序字符小的字符,移动到它的前面,当最大字典序的字符移动到子序列末尾的时候,再次移动就可以视为没有移动)。

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const int M=2e5+5;
int vis[M];
int main(){int t; cin>>t;while(t--){int n; cin>>n;string s; cin>>s;string tmp; tmp=s;for(int i=0;i<n;i++) vis[i]=0;sort(tmp.begin(),tmp.end());string ss="";char ch=0;for(int i=s.size()-1;i>=0;i--){if(ch<=s[i]){ch=s[i];ss+=ch;vis[i]=1;}}int ans=-1;for(int i=0,t=0;i<n;i++){if(vis[i]){if((ch==ss[t])&&ans==-1) ans=t;s[i]=ss[t++];}}if(tmp==s) cout<<ans<<endl;else cout<<"-1"<<endl;  }
}

四、XOR Palindromes

[XOR Palindromes](XOR Palindromes - CodeForces 1867B - Virtual Judge (vjudge.net))

例:101011

对于1,6两个位置的字符都为1,是对称的,可以选择与1异或变成0,也可以与0异或变成1。每一对相等的对称字符都可以做这两种选择。而对于不相等的对称字符,若想让两者相等,必定会有一位与1异或操作,另一位与0异或,也就是异或字符串中必定会出现一个1。

接下来考虑字符串长度的奇偶性,我们设 d d d为两者不同的字符对的对数,s为相同的字符对的对数。

(1)若为偶数,则一的数量有以下几种情况 d , d + 2 , d + 4 , … … , d + 2 ∗ s d,d+2,d+4,……,d+2*s d,d+2,d+4,……,d+2s

(2)若为奇数,由于中间的数可以随意改变,则一的数量有以下几种情况 d , d + 1 , d + 2 , … … , d + 2 ∗ s + 1 d,d+1,d+2,……,d+2*s+1 d,d+1,d+2,……,d+2s+1

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int M=1e5+5;
int t[M];
int main(){int p; cin>>p;while(p--){int n; cin>>n;string s;cin>>s;// int cnt=0;int c[2]={0,0};for(int i=0;i<=n;i++) t[i]=0;s=" "+s;for(int i=1;i<n-i+1;i++){if(s[i]==s[n-i+1]) c[1]++;else c[0]++;}// cout<<c[0]<<" "<<c[1]<<endl;if(n&1) for(int i=c[0];i<=c[0]+2*c[1]+1;i++) t[i]=1;else for(int i=c[0];i<=c[0]+2*c[1];i+=2) t[i]=1;//   for(int i=0;i<=n;i++){//      cout<<t[i]<<" ";//   }//  cout<<endl;for(int i=0;i<=n;i++){putchar(t[i]+'0');}cout<<endl;}
}

五、Strong Password

[Strong Password](Strong Password - CodeForces 1845C - Virtual Judge (vjudge.net))

枚举每一个密码字符,当有一个字符没有在密码数据库中,就输出YES

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;int main(){int t; cin>>t;while(t--){string s; cin>>s;int m; cin>>m;string l; cin>>l;string r; cin>>r;l=" "+l; r=" "+r;int pos=0;int f=0; int maxp=0;for(int i=1;i<=m;i++){for(int j=l[i];j<=r[i];j++){int tmp=s.find(j,pos);if(tmp==-1){f=1;break;}++tmp;if(tmp>maxp){maxp=tmp;}}pos=maxp;if(f==1){break;}}if(f==1){cout<<"YES"<<endl;}else cout<<"NO"<<endl;}
}

六、Row Major

[Row Major](Row Major - CodeForces 1844D - Virtual Judge (vjudge.net))

观察得到,行列的值都是n的因数。

举个例子:若n为6,那么可以组成23或3 * 2的网格图,若原字符串为ababab,那么一定在32的网格图中两行之间会相同,abcabc同理。所以不难发现,以n的因数为循环节是不可以的,所以要想使不相同的字符最少,就要以n的最小非因数大小为循环节大小。

#include<iostream>
#include<algorithm>
using namespace std;
const int M=1e6+5;
char ans[M];
int main(){int t; cin>>t;while(t--){int n; cin>>n;if(n==1){cout<<"a"<<endl;continue;}if(n==2){cout<<"ab"<<endl;continue;}int pos=0;for(int i=1;i<=n;i++){if(n%i){pos=i;break;}}for(int i=0;i<pos;i++){ans[i]=i+'a';}for(int i=0;i<n;i++){cout<<ans[i%pos];}cout<<endl;}
}

七、Game with Reversing

[Game with Reversing](Game with Reversing - CodeForces 1834C - Virtual Judge (vjudge.net))

字符串能够在翻转后匹配要么是正向匹配,要么是逆向匹配,所以可以正反处理出需要修改的字符数量。

字符串翻转偶数次后,与原字符串顺序相同,翻转奇数次后,与原字符串顺序相反。

正向匹配一定翻转偶数次,逆向匹配一定翻转奇数次。

#include<iostream>
#include<algorithm>
using namespace std;int main(){int t; cin>>t;while(t--){int n; cin>>n;string s,p; cin>>s>>p;int cntz=0;for(int i=0;i<n;i++){if(s[i]!=p[i]){cntz++;}}int cntf=0; int cnt=0;for(int i=n-1;i>=0;i--){if(s[i]!=p[cnt++]){cntf++;}}if(cntz==0){cout<<0<<endl;continue;}if(cntf==0){cout<<2<<endl;continue;}int ans=cntz*2-(cntz%2==1); //若修改次数为奇数,最后一次不用反转ans=min(ans,cntf*2-(cntf%2==0)); //若修改次数为偶数次,最后一次不用反转cout<<ans<<endl;}
}

八、Tear It Apart

[Tear It Apart](Tear It Apart - CodeForces 1821C - Virtual Judge (vjudge.net))

枚举每个字母作为分割边界,我们对分割出来的最长子串进行操作,每次除以2,记录操作次数,即模拟删除过程,最后统计操作次数当中的最小值即可。

#include<iostream>
#include<algorithm>
using namespace std;int main(){int t; cin>>t;while(t--){string s; cin>>s;int ans=1e9+5;for(char i='a';i<='z';i++){int cnt=0; int maxn=0;for(int j=0;j<s.size();j++){//   cout<<char(i+'a')<<endl;if(s[j]!=i){cnt++;}else{cnt=0;}maxn=max(maxn,cnt);}int res=0;while(maxn){++res;maxn/=2;}ans=min(ans,res);}cout<<ans<<endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孙中亮:北斗三十周年,看北斗芯片高质量发展历程和方向

1994年1月10日&#xff0c;北斗一号建设正式启动&#xff0c;党中央决策建设独立自主的北斗卫星导航系统。2020年7月31日&#xff0c;北斗三号全球卫星导航系统正式开通&#xff0c;标志着北斗系统进入全球化发展新阶段。随着2024年的到来&#xff0c;北斗系统建设已走过栉风沐…

汇智知了堂走进宜宾学院,共话国产化信创未来!

在春意盎然的四月&#xff0c;汇智知了堂以其深厚的品牌底蕴和卓越的教育品质&#xff0c;再次展现了其在教育领域的领先地位。4月18日&#xff0c;汇智知了堂走进宜宾学院&#xff0c;为广大学子带来了一场关于国产化信创时代的技术变革与专业学习建议的讲座。 汇智知了堂作…

2024深圳杯(东三省)数学建模挑战赛D题:音板的振动模态分析与参数识别思路代码成品论文分析

​ 更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯&#xff08;东三省&#xff09;数学建模挑战赛2024D题&#xff1a;音板的振动模态分析与…

YoloV9改进策略:注意力改进、Neck层改进_自研全新的Mamba注意力_即插即用,简单易懂_附结构图_检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能&#xff0c;导入就需要先下载一个模板&#xff0c;然后在模板文件中填写内容&#xff0c;最后导入模板&#xff0c;导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下&#xff1a; import {MessageBox,Mes…

赋能数据检索:构建用于www.sohu.com的新闻下载器

引言 在信息爆炸的时代&#xff0c;随着新闻数据的数量不断增长&#xff0c;获取和分析这些数据变得尤为关键。本文将介绍如何构建一个高效的新闻下载器&#xff0c;专门用于从搜狐网&#xff08;www.sohu.com&#xff09;检索和下载新闻内容。 背景介绍 搜狐网作为中国领先…

40. 【Android教程】AsyncTask:异步任务

在前面的章节有提到过&#xff0c;Android 系统默认会在主线程&#xff08;UI 线程&#xff09;执行任务&#xff0c;但是如果有耗时程序就会阻塞 UI 线程&#xff0c;导致页面卡顿。这时候我们通常会将耗时任务放在独立的线程&#xff0c;然后通过 Handler 等线程间通信机制完…

外贸干货|客户迟迟不付款,怎么催?

(一) Gentle reminder 温馨提醒 "Hello Mary, l hope this message finds you well. l wanted to kindly remind you about the payment for our agreed-upon order. We appreciate your business and would like to proceed with the next steps as soon as possible.…

DS32K查看内置寄存器数值

需要在debug的时候进行查看&#xff0c;先暂停&#xff0c;再打开EmbSys Registers窗口。 需要先将导出的内容选中并双击&#xff0c;不然复制出来会变成问号。右上角有个复制按钮&#xff0c;复制到剪贴板就行。譬如我这里选择了MCR寄存器&#xff0c;复制出来的就是这个寄存器…

下载nvm来配置node版本

背景提示&#xff1a;入职的公司项目久远&#xff0c;一直运行不起来&#xff0c;原来是我node版本太高&#xff0c;需要降级才行。然后找到这个nvm配置一下 准备工作 如果电脑有配置node的&#xff0c;需要先卸载掉才能配置nvm&#xff01;&#xff01;&#xff01;这是重点嗷…

大模型解决方案:具体业务场景下的智能表单填充(附代码)

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型…

JS -正则表达式

正则表达式 关于正则表达式&#xff0c;其实我写过几篇了&#xff0c;但是真正的正则表达式其实主要用于定义一些字符串的规则&#xff0c;计算机根据给出的正则表达式&#xff0c;来检查一个字符串是否符合规则。 我们来看一下&#xff0c;在JS中如何创建正则表达式对象。 语…

第67天:APP攻防-Frida反证书抓包移动安全系统资产提取评估扫描

思维导图 案例一&#xff1a;内在-资产提取-AppinfoScanne AppinfoScanner 一款适用于以 HW 行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具&#xff0c;可以帮助渗透测试工程师、攻击队成员、红队成员快速收集到移动端或者静态 WEB …

【禅道客户案例】小反馈,大杠杆!银丰新融「反馈管理」优秀实践

企业介绍 北京银丰新融科技开发有限公司&#xff08;简称&#xff1a;银丰新融&#xff09;成立于2000 年&#xff0c;自创立以来一贯专注于金融监管、风险管控等领域的信息系统建设&#xff0c;拥有目前国内金融风险领域规模庞大的信息技术服务团队。 银丰新融业务范围覆盖了…

VUE3 ref,props,生命周期

1.--ref属性 1.1代码 1.1.1子表 <template><div class"person"><h1>中国</h1><h2 ref"title2">北京</h2><h3>尚硅谷</h3><button click"showLog">点我输出h2这个元素</button>&l…

JavaScript注释:单行注释和多行注释详解

为了提高代码的可读性&#xff0c;JS与CSS一样&#xff0c;也提供了注释功能。JS中的注释主要有两种&#xff0c;分别是单行注释和多行注释。 在编程的世界里&#xff0c;注释是那些默默无闻的英雄&#xff0c;它们静静地站在代码的背后&#xff0c;为后来的维护者、为未来的自…

到底什么是爬虫

1. 引言 在数据驱动的世界里&#xff0c;网络爬虫&#xff08;Web Crawling&#xff09;技术扮演着获取和处理网上数据的关键角色。无论是为了数据分析、机器学习项目的数据集构建还是简单地监测网页变化&#xff0c;学习如何创建一个基本的网页爬虫可以大大提升你的工作效率和…

Vue页面生成导出PDF文件

第一种&#xff1a; 使用浏览器自带打印方法window.print(); 也可使用print-js插件&#xff08;原理相同&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>printDemo</title> </…

【Vue】常见的七大属性(描述+案例)

一、前言 最近&#xff0c;因为项目需要自己就去学习了一下Vue的相关知识&#xff0c;自己花了几天&#xff0c;结合官方文档和相应的视频学习了一下Vue,了解了Vue大概的一些属性&#xff0c;方法&#xff0c;特点等。接下来博主会将自己学习的相关内容通过博客的形式进行记录…

Linux蓝牙驱动模拟HID设备(把Linux系统模拟成蓝牙鼠标和蓝牙键盘)

by fanxiushu 2024-04-24 转载或引用请注明原始作者。 在经过windows的蓝牙驱动开发模拟成HID设备的大风大浪之后&#xff0c; 现在回到linux下实现相同功能&#xff0c;简直就是如小孩嬉闹一样的轻松。 但无论如何&#xff0c;作为模拟蓝牙HID设备的windows&#xff0c;linux一…