当前位置: 首页 > news >正文

【蓝桥每日一题]-字符串(保姆级教程 篇1)#atcoder324C~E题

今天来讲字符串题型

目录

题目:atcoder324C题

思路:

题目:atcoder324D题

思路:

题目:atcoder324E题

思路:


      

             

题目:atcoder324C题

给一个T字符串,然后给出n个S串,对于每个一个S串若可以经过一次字符修改,删除,添加可以变成T串,则输出该串的序号。

       

思路:

(c题一般不是很难,只要有点基础基本可以敲出来)


修改:两个串长度相等,且只有一个字符是不同的(这个最好处理)

     
删除:T只比S小1,且T串一定是S的子串

     
添加:S只比T小1,且S串一定是T的子串(这两种都是只需要判断是不是子串即可)

 

 相信你也注意到了,对于比给定串恰好大1的情况,完全可以使用子串匹配来做

       

#include <bits/stdc++.h>
using namespace std;
const int MAX_N=500000;
int ans[MAX_N],ans_num;
int check1(string s1,string s2){//判断s1和s2是不是只有1个或0个不同int res=0,sz=s1.size();for(int i=0;i<sz;i++){if(s1[i]!=s2[i])res++;}if(res<=1)return 1;else return 0;
}
int check2(string s1,string s2){//判断s1是否是s2的子串,因为s2只比s1大1,所以非常简单int sz=s1.size(),r=sz,l=0;for(int i=0;i<sz;i++){if(s1[i]!=s2[l])break;l++;}for(int i=sz-1;i>=0;i--){if(s1[i]!=s2[r])break;r--;}return l>=r;
}
int main(){int n; string t;cin>>n>>t;int sz=t.size();for(int i=1;i<=n;i++){string s; cin>>s;int sz1=s.size();if(sz1==sz){if(check1(t,s))  ans[++ans_num]=i;}else if(sz+1==sz1){if(check2(t,s))  ans[++ans_num]=i;}else if(sz==sz1+1){if(check2(s,t))  ans[++ans_num]=i;}}cout<<ans_num<<'\n';//满足题意的个数for(int i=1;i<=ans_num;i++){cout<<ans[i];//输出序号if(i+1<=ans_num)	cout<<' ';else	cout<<'\n';}}

      

      

题目:atcoder324D题

给一个长n的字符串,问进行排列后最多能拼成几个完全平方数 (n<13)

       

思路:

最不应该的做法就是将字符串进行全排列然后逐个检查,因为阶乘太大了一定会超时。

    

应该先把小于最大n的平方数全部打表出来,然后检查每个平方数是不是这个字符串的重排列:                                                       

这里要用到to_string函数可以快速将数型转化成字符型,然后检查重排列即可。

如何检查一个字符串是不是另一个的重排列呢?

     
方法:将两个字符串都排序一下,然后检查排序后的一样不一样即可。

      
注意一点:字符串100应该等于1和100,但是只有数字100的字符串(001)和字符串100的(001)完全相同,数字1的字符串需要自动添加前缀(00)才能!
 

          

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500000;
int main(){int n;string s;//输入长度和字符串cin>>n>>s;sort(s.begin(),s.end());//默认升序if(s.back()=='0'){cout<<"1\n";return 0;}int ans=0;for(ll x=1;;x++){//逐个比较每个字符串ll tmp=x*x;//防止隐式转化越界,故x为ll型string t=to_string(tmp);//to_string()  stoi ll d()int st=t.size();if(st>n)  break;else {sort(t.begin(),t.end());t=string(n-st,'0')+t;//t长度不够,自动加一定数量的‘0’if(s==t)  ans++;}}cout<<ans<<'\n';
}

       

最后:补充一下string的排序,两种降序办法


bool cmp(char a,char b){return a>b;
}
int main(){string s;cin>>s;sort(s.begin(),s.end());//方法1sort(s.begin(),s.end());//方法2reverse(s.begin(),s.end());//方法2cout<<s;
}

        

         

题目:atcoder324E题

给一个t字符串和n个字符串,我们将n个字符串进行n^2次相互拼接,问最终t会是几个拼接成的字符串的子序列(N<=5e5)

      

思路:

补充:子序列 && 子串:子序列不是字符串可以跳跃下标,子串是字符串不能跳跃下标 

     
t是拼接成的字符串的子序列,就相当于  前部分字符串的子序列字符个数  加  后部分字符串子序列字符个数  大于等于t即可

       
统计子序列方法:串的子序列字符个数就是当前的下标数,贪心统计即可 。

     
然后就转变成了从两个数组中分别找一个数相加大于指定数值的问题:两种O(N)方法,一种是后缀和统计法,另一种就是lower_bound,upper_bound
     

           

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;//后缀和统计法:将元素的数值直接填入标记数组中,然后使用后缀和计算个数
const int N=500050;//测试点有个500000整的,很恶心
int ar[N];
ll sum[N],ans;
int main(){int n;string t;cin>>n>>t;int st=t.size();string s[n];for(int i=0;i<n;i++)cin>>s[i];for(int i=0;i<n;i++){//遍历每个字符串int ptr=0;for(int j=0,sz=s[i].size();j<sz;j++){if(ptr<st&&t[ptr]==s[i][j])ptr++;//统计每个对应的子序列字符的个数,个数也是下标数}ar[ptr]++;//将数值填入标记数组}for(int i=st;i>=0;i--)sum[i]=sum[i+1]+ar[i];//后缀和数组reverse(t.begin(),t.end());//颠倒一下,把统计后缀子序列问题转化成统计前缀子序列问题for(int i=0;i<n;i++){int ptr=0;reverse(s[i].begin(),s[i].end());for(int j=0,sz=s[i].size();j<sz;j++){//一模一样的代码if(ptr<st&&t[ptr]==s[i][j])ptr++;}ans+=sum[st-ptr];//st是最大值}cout<<ans<<'\n';
}//做法二  lower_bound:将数组数值排序,然后二分查找满足条件的临界数的下标,向后计算个数即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500050;
int ar[N],br[N];
ll ans;
int main(){int n,len1=0,len2=0;string t;cin>>n>>t;int st=t.size();string s[n];for(int i=0;i<n;i++)cin>>s[i];for(int i=0;i<n;i++){int ptr=0;for(int j=0,sz=s[i].size();j<sz;j++){if(ptr<st&&t[ptr]==s[i][j])ptr++;}ar[len1++]=ptr;//直接保存数据}sort(ar,ar+len1);//默认升序reverse(t.begin(),t.end());for(int i=0;i<n;i++){int ptr=0;reverse(s[i].begin(),s[i].end());for(int j=0,sz=s[i].size();j<sz;j++){if(ptr<st&&t[ptr]==s[i][j])ptr++;}int pos=lower_bound(ar,ar+len1,st-ptr)-ar;//找到下标ans+=len1-pos;//后面的都是满足的}cout<<ans<<'\n';
}

相关文章:

【蓝桥每日一题]-字符串(保姆级教程 篇1)#atcoder324C~E题

今天来讲字符串题型 目录 题目&#xff1a;atcoder324C题 思路&#xff1a; 题目&#xff1a;atcoder324D题 思路&#xff1a; 题目&#xff1a;atcoder324E题 思路&#xff1a; 题目&#xff1a;atcoder324C题 给一个T字符串&#xff0c;然后给出n个S串&#xff0c;对…...

4.2.1 SQL语句、索引、视图、存储过程

怎么执行一条select语句 1.连接器 接收连接-》管理连接-》校验用户信息 2.查询缓存 kv存储&#xff0c;命中直接返回&#xff0c;否则继续执行 8.0已经删除 3.分析器 词法句法分析生成语法树 4.优化器 指定执行计划&#xff0c;选择查询成本最小的计划 5.执行器 根据执行计划&a…...

1992-2021年全国各地级市经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年全国各地级市经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;分区域汇总&…...

机器人的触发条件有什么区别,如何巧妙的使用

简介​ 维格机器人触发条件,分为3个,分别是: 有新表单提交时、有记录满足条件时、有新的记录创建时 。 看似3个,其实是能够满足我们非常多的使用场景。 本篇将先介绍3个条件的触发条件,然后再列举一些复杂的触发条件如何用现有的触发条件来满足 注意: 维格机器人所有的…...

【Qt6】QStringList

2023年10月31日&#xff0c;周二上午 QStringList 是 Qt 中的一个类&#xff0c;用于存储一组字符串。它提供了一些方便的方法来操作和管理字符串列表。 QStringList 可以用于存储任意数量的字符串&#xff0c;并提供了一些常用的操作&#xff0c;例如添加、删除、查找、排序等…...

代码随想录算法训练营第五十三天|309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

309. 买卖股票的最佳时机含冷冻期 int maxProfit(int* prices, int pricesSize){int len pricesSize;int dp[len][4];dp[0][0] -prices[0];dp[0][1] 0;dp[0][2] 0;dp[0][3] 0;for (int i 1; i < pricesSize; i){dp[i][0] fmax(dp[i-1][0], fmax(dp[i-1][1] - prices…...

厚黑学笔记

厚黑学 我现在的情况就是在听书听到一半&#xff0c;但在软件上看书已经看完了&#xff0c;厚黑学要讲的东西大概已经摸清楚了。 总体来说&#xff0c;厚黑学里面的章节内容有一点沾边的嫌疑&#xff08;看完后的想法)&#xff0c;但这本书还是有值得阅读的&#xff0c;但主讲…...

IDEA MyBatisX插件介绍

一、前言 前几年写代码的时候&#xff0c;要一键生成DAO、XML、Entity基础代码会采用第三方工具&#xff0c;比如mybatis-generator-gui等&#xff0c;现在IDEA或Eclipse都有对应的插件&#xff0c;像IDEA中MyBatisX就是一个比较好用的插件。 二、MyBatisX安装配置使用 MyBa…...

【PyQt学习篇 · ②】:QObject - 神奇的对象管理工具

文章目录 QObject介绍Object的继承结构测试QObject对象名称和属性QObject对象名称和属性的操作应用场景 QObject父子对象QObject父子对象的操作 QObject的信号与槽QObject的信号与槽的操作 QObject介绍 在PyQt中&#xff0c;QObject是Qt框架的核心对象之一。QObject是一个基类…...

【AcWing】1.1.3二分搜索

一、二分搜索 1、查找数的范围 原题链接  这道题看似是二分搜索的题目&#xff0c;实则就是二分搜索。与一般的搜索不同的是&#xff0c;若查找元素重复&#xff0c;则分别返回重复元素的左端下标和右端下标&#xff0c;若不存在则返回“-1 -1。我们常用的二分搜索是返回的…...

【Python第三方包】串口通信(pySerial包)

文章目录 前言一、串口的基本使用1.1 配置串口基本信息1.2 读取串口数据1.3 写串口1.4 关闭串口二、示例代码2.1 示例1: 从串口读取数据2.2 示例2: 向串口写入数据总结前言 串口通信是许多嵌入式和物联网应用中的关键组成部分。Python 提供了许多第三方库来简化串口通信的实现…...

VS Code2023安装教程(最新最详细教程)附网盘资源

目录 一.简介 二.安装步骤 三.VS Code 使用技巧 网盘资源见文末 一.简介 VS Code是一个由微软开发的跨平台的轻量级集成开发环境&#xff08;IDE&#xff09;&#xff0c;被广泛用于编写各种编程语言的代码。它支持多种编程语言&#xff0c;并且可以通过插件扩展功能。 以…...

最优值函数

一、最优状态值函数 解决强化学习任务大致上意味着找到一种政策&#xff0c;能够在长期内实现很多奖励。对于有限MDPs&#xff0c;我们可以精确地定义一种最优政策&#xff0c;其定义如下。值函数定义了政策的一种部分排序。如果一个政策的预期回报大于或等于另一个政策π0在所…...

软考系统架构师知识点集锦十:计算机网络、数学与经济管理、知识产权与标准化

一、计算机网络 1.1、考情分析 2.1 TCP/IP协议簇 2.1.1常见协议及功能 网际层是整个TCP/IP体系结构的关键部分,其功能是使主机可以把分组发往任何网络并使分组独立地传向目标。 POP3: 110 端口&#xff0c;邮件收取SMTP: 25 端口&#xff0c;邮件发送FTP: 20数据端口/21控制…...

风云七剑攻略,最强阵容搭配

今天的风云七剑攻略最强阵容搭配给大家推荐以神仙斋减怒回血为主的阵容。 关注【娱乐天梯】&#xff0c;获取内部福利号 首先&#xff0c;这个角色在这个阵容当中&#xff0c;所有的角色当中&#xff0c;他的输出系数是最高的&#xff0c;已经达到了200%的层次&#xff0c;而且…...

关于ABB 机器人多任务的建立

关于ABB 机器人多任务的建立.需要实时监控某一区域&#xff0c;或者某一信号&#xff0c;或者计件到达某一数量机器人自动停止报警&#xff0c;显示到示教器上&#xff0c;多任务可以实现&#xff0c;类似发那科机器人后台逻辑指令 当软件选项漏选或者少选可以选择修改选项&…...

【计算机网络笔记】传输层——多路复用和多路分用

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

【PC】特殊空投-2023年10月

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 10月特殊空投活动来袭。本月我们也准备了超多活动等着大家来体验。快来完成任务获得丰富的奖励吧&#xff01;签到活动&#xff0c;每周一次的PUBG空投节&#xff0c;还有可以领取PGC2023免费投票劵的活动等着大家&#xff01;…...

Android Studio 下载地址

一、Android Studio 下载地址及版本说明 1.Android 开发者官网&#xff1a;&#xff08;1&#xff09;Android Developers &#xff08;全球&#xff0c;需科学上网&#xff09; &#xff08;2&#xff09;https://developer.android.google.cn/index.html &#xff08;国内&a…...

General error: 2006 MySQL server has gone away thinkphp6.0 报这个错误怎么修改

"General error: 2006 MySQL server has gone away" 错误表示 MySQL 服务器连接已断开或超时&#xff0c;导致无法继续进行数据库操作。 在 ThinkPHP 6.0 中&#xff0c;您可以通过以下方法来解决这个问题&#xff1a; 调整 MySQL 服务器的超时设置&#xff1a;您可…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...