Acwing.第119场周赛
可惜这场比赛没打,去操场溜达去了哈哈哈哈
比赛链接
A 字符串还原
有一个由小写字母构成的字符串 b是通过以下方法生成的:
首先,构造一个由小写字母构成的长度不少于 2的字符串 a。
然后,按照从左到右的顺序,将字符串 a的所有长度为 2的子串拼接在一起,构成字符串 b。
例如,如果字符串 a为 abac,那么其所有长度为 2的子串从左到右依次为 ab、ba、ac,将它们拼接在一起,构成的字符串 b为 abbaac。
现在,给定构造好的字符串 b,请你还原出字符串 a。
可以证明,此问题的答案是唯一的。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据占一行,包含一个由小写字母构成的字符串 b。
输入保证给定的字符串 b 一定是按照题目所述方法生成的。
输出格式
每组数据输出一行结果,一个字符串,表示字符串 a。
数据范围
前 3个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤1000,2≤|b|≤100。
A思路:
这个题其实就是一个模拟,只要想通了就明白了,我们组成的字符串b字符重复地方是要做取舍的,如果有两个字符一样且是挨着的,那么我们只需要取其中一个就可以了。
A代码:
#include<bits/stdc++.h>
using namespace std;
void solve(){
string a;
cin>>a;
for(int i=0;i<a.size();i++){
if(i%2==0){
cout<<a[i];
}
else{
if(a[i]!=a[i+1]){
cout<<a[i];
}
else{
continue;
}
}
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
B 英文数字
给定一个小于 100 的非负整数 n,请输出其对应的英文写法。
关于数字的具体英文单词不再赘述,需注意的是:当一个数在 [21,99]范围内时,如果末位不为 0,则用来描述该数的两个单词需要用 - 连接,例如 twenty-one(21)、thirty-two(32)、ninety-nine(99)等等。
B思路:
我靠,这不就是一个巨麻烦的模拟吗???开个字符串数组打表就行了。
B代码:
#include <iostream>
using namespace std;
string s[] = {"zero", "one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two","twenty-three","twenty-four","twenty-five","twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty-one","thirty-two","thirty-three","thirty-four","thirty-five","thirty-six","thirty-seven","thirty-eight","thirty-nine","forty","forty-one","forty-two","forty-three","forty-four","forty-five","forty-six","forty-even","forty-eight","forty-nine","fifty","fifty-one","fifty-two","fifty-three","fifty-four","fifty-five","fifty-six","fifty-seven","fifty-eight","fifty-nine","sixty","sixty-one","sixty-two","sixty-three","sixty-four","sixty-five","sixty-six","sixty-seven","sixty-eight","sixty-nine","seventy","seventy-one","seventy-two","seventy-three","seventy-four","seventy-five","seventy-six","seventy-seven","seventy-eight","seventy-nine","eighty","eighty-one","eighty-two","eighty-three","eighty-four","eighty-five","eighty-six","eighty-seven","eighty-eight","eighty-nine","ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six","ninety-seven","ninety-eight","ninety-nine"};
int main()
{
int n; cin >> n;
cout << s[n];
return 0;
}
C 同色环
查看图片或题目
有一个 n×m的方格矩阵,每个方格都有一种颜色。
颜色最多不超过 26种,我们将使用不同的大写英文字母来表示不同的颜色。
你的任务是在矩阵中找到一个规模不小于 4的同色环。
也就是说,请你在矩阵中找到 k个不同的方格,要求它们能够同时满足:
k≥4
k个方格的颜色相同。
将这 k个方格按某种顺序编号为 1∼k后,能够满足方格 1与方格 2相邻、方格 2与方格 3相邻、…、方格 k−1与方格 k相邻、方格 k与方格 1相邻。如果两个方格存在公共边,则称两个方格相邻。
请你判断,在给定矩阵中是否存在满足条件的同色环。
C思路:
好好好,一眼就是求连通块的问题。
C代码:
#include<bits/stdc++.h>
using namespace std;
const int N=55;
char a[N][N];
bool f[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n,m;
bool dfs(int x,int y,int x1,int y1,int cnt){
if(x==x1&&y==y1&&cnt>=4){
return true;
}
for(int i=0;i<4;i++){
int x2=x1+dx[i];
int y2=y1+dy[i];
if(x2<1||x2>n||y1<1||y2>m){
continue;
}
if(a[x2][y2]!=a[x1][y1]){
continue;
}
if(f[x2][y2]){
continue;
}
f[x2][y2]=true;
if(dfs(x,y,x2,y2,cnt+1)){
return true;
}
f[x2][y2]=false;
}
return false;
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
memset(f,false,sizeof f);
bool flag=dfs(i,j,i,j,1);
if(flag){
cout<<"Yes"<<endl;
return ;
}
}
}
cout<<"No"<<endl;
return ;
}
int main(){
int t;
// cin>>t;
t=1;
while(t--){
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】