0209-0217校赛部分题解

SMU Winter 2024 Round #3 (Div.2)

对于自己比较有价值的题目是
D题 https://codeforces.com/gym/102897/problem/D?mobile=true
J题 https://codeforces.com/gym/102897/problem/J
K题 https://codeforces.com/gym/102897/problem/K
E题 https://codeforces.com/gym/102897/problem/K

D题
题目看似很长一大串,非常吓人,但实际上只需要抓住两个关键词:回文字符串被分割 后 的最长长度,我们要记住,单个字符就是一个回文字符串。那么问题就很好解决了,只需要统计总共出现过几个字母就行啦

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int sum;
void solve()
{
	string s;
	cin>>s;
	sum+=s.size();
}


signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	cout<<sum;
	return 0;
	 	
}

J题
这题其实就是在统计出现过的字符种类数,但是每种可能出现多次,那么我们便可以想到一个不存在重复元素的容器set容器,介绍一些set的基础操作,set 的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。
s.begin() 返回指向第一个元素的迭代器
s.end() 返回指向最后一个元素的迭代器
s.clear() 清空所有元素
s.empty() 检查集合是否为空 若空返回true
s.insert() 在集合中插入元素
s.size() 集合中的元素数目

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int lj(string&str)
{
	set<char> q;
	for(char c:str){
		if(c!='.') q.insert(c);
	}
	return q.size();
}

void solve()
{
	int n,sum=0; 
	cin>>n;
	while(n--)
	{
		string s;
		cin>>s;
		sum+=lj(s);
	}
	cout<<sum<<endl;
}

int main()
{
	int  t;
	cin>>t;
	while(t--)
	{
		
		solve();
		
	}
  return 0;
}

E题
这一题就是输出图案就行,但是注意‘/’要使用转义字符就是在printf里输入两个//

点击查看代码
#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin>>s;
	printf(" __      _____\n");
	printf("|  | ___/ ____\\____\n");
	printf("|  |/ /\\   __\\/ ___\\\n");
	printf("|    <  |  | \\  \\___\n");
	printf("|__|_ \\ |__|  \\___  >\n");
	printf("     \\/           \\/");
 return 0;
}

K题 还不会嘿嘿

VJ第三次选拔赛

D题 https://codeforces.com/gym/103488/problem/D
题目要我们找ybb开头,而后还是bbb.....的字符串,如ybb,ybbb,ybbbb在ybbb里计数为两次,因为有ybb和ybbb,其他的同理,我们可以找到ybb以后计数加一,然后统计ybb以后有多少个b即可,开个双指针即可

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
	int n,cnt=0;
	cin>>n;
	string s;
	cin>>s;
	for(int i=0,j=0;i<s.size();i++)
	{
		if(s[i]=='y'&&s[i+1]=='b'&&s[i+2]=='b')
		{
			cnt++;
		for(int j=i+3; ;j++) 
		{
			if(s[j]=='b') cnt++;
			else break;
		}
			
			
		}
	}
	
	cout<<cnt<<endl;
	
	
}



int main()
{
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

H题 https://codeforces.com/gym/103488/problem/H
这一题要注意推理,MEX=n时有一种情况,序列为1、2、3...n-1,MEX=0的时候,序列不含0,每个数可以选或者不选有2^(n-1) 种情况,MEX=1的时候,含0不含1,每个数选或不选有2^(n-2) 种,依次推下去,MEX为i时,序列不含i,必须含0~i-1,然后剩下的n-i-1个数每个数可以选或者不选,就是2^(n-i-1) 种,通过列项相消就可以得出MEX=2^n -1种,通过快速幂然后取余即可
快速幂:其实就是用记忆化递归,给个模板

点击查看代码
ll qpow(ll a,ll n)
{
	if(n==0) return 1;
	else if(n%2==1){
		return a*qpow(a,n-1)%mod;
	}
	else{
		ll temp=qpow(a,n/2);
		return temp*temp%mod;
	}
	
}

题解来啦

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const long long mod=998244353;	
typedef long long ll;
ll qpow(ll a,ll n)
{
	if(n==0) return 1;
	else if(n%2==1){
		return a*qpow(a,n-1)%mod;
	}
	else{
		ll temp=qpow(a,n/2);
		return temp*temp%mod;
	}
	
}
void solve()
{
	int n,k,ans;
		cin>>k;
		ans=qpow(2,k)-1;
		cout<<ans<<"\n";
	
	
}



signed main()
{
	 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	 int t;
	 cin>>t;
	 while(t--)
	 {
	 	solve();
	 }
}

L题 https://codeforces.com/gym/103488/problem/L
这一题其实就是要记得两个点ybba和ybb相比 ybba的字典序更大,所以遇到结尾为a的就去掉a 不是a的就把末尾改为a再添加z即可,利用一下string的find函数找最后一位,先开个26个字母的字符串

点击查看代码
#include <bits/stdc++.h>
using namespace std;
string al="abcdefghigklmnopqrstuvwxyz";
void solve()
{
	int n,m;
	cin>>n>>m;
	string s;
	cin>>s;
	int pos=al.find(s[n-1]);//利用查找函数 
	if(s[n-1]!='a'){
		s[n-1]=al[pos-1];
		for(int i=0;i<m-n;i++)
		{
			s+='z';
		}
	}
	else s.erase(s.size()-1);//删除最后一位字母a 
	
	cout<<s;
	
}


int main()
{
	int t=1;
	while(t--)
	{
		solve();
	}
	return 0;
 } 

牛客基础训练营

A题 https://ac.nowcoder.com/acm/contest/67743/A
简单的比较首字符是否相同 忽略大小写 用string a b就可以啦

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
	string a,b;
	cin>>a>>b;
	if(a[0]==b[0]||a[0]==b[0]-32||a[0]-32==b[0]) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	
	
	
	
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	
}

L题 https://ac.nowcoder.com/acm/contest/67743/L
简单的遍历 用stoi把字符串类型转化为整数

点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
	int n,k,res=0;
	string s[1005],s1;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(j!=i){//这样写就相当于你从左开始遍历一次,从右又开始遍历一次 
				s1=s[i]+s[j];
				k=stoi(s1);//字符串转为整数
				if(k%36==0) res++; 
			}
		}
	}
	cout<<res;
	
	
}
int main()
{
	int t=1;
	while(t--)
	{
		solve();
	}
}

M题 https://ac.nowcoder.com/acm/contest/67743/M
还不是很理解

posted on 2024-02-17 03:04  swj2529411658  阅读(32)  评论(0)    收藏  举报

导航