Atcoder347回顾(上)

文章讲述了两个编程问题:如何在O(n)时间复杂度内找出数组中K的倍数并输出,以及计算给定字符串不同子字符串的数量,利用set实现去重。
摘要由CSDN通过智能技术生成
A题Divisible

题目概要:

有一个长度为N的数组,要求你把K的倍数的数除以K,所得到的值输出出来。

数据范围:

1≤N,K≤100

1≤A1​<A2​<…<AN​≤100

样例:

输入

5 2
2 3 6 7 10

输出:

1 3 5

首先,让我们分析一下样例

K=2,可以看出,K的倍数有2,6,10

所以,答案就是2/2,6/2,10/2

又因为这个数组本来就是排好序的,所以就不用再排序了

所以就可以把长度为N的这个数组给他遍历一遍,在遍历的过程中,计算该数值是不是K的倍数,是就除以K得到结果后就把它输出掉,这样子就可以在O(n)的算法下完成任务。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int a[101];
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]%k==0){
			cout<<a[i]/k<<" ";
		}
	}
	return 0;
}

B题Substring

题目概要:

给你一个字符串,要求你把他的不同的子字符串的个数求出来

数据范围:

S的长度不超过100

样例:

输入:

yay

输出:

5

我们先分析一下样例,yay有子串y,a,y,ya,ay,yay,但是有两个y,我们只能用一个,所以就有5个子串

由于要去重,我们应该第一时间想到set(就是一个可以自动去重和排序的东西)

再尝试去把所有的子串算出来就可以了

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
set<string> t;
set<string>::iterator it;
int cnt;
signed main(){
	cin>>s;
	int n=s.size();
	s="#"+s;
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			t.insert(s.substr(i,j-i+1));
		}
	}
	for(it=t.begin();it!=t.end();it++){
		cnt++;
	}
	cout<<cnt;
	return 0;
}

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值