智算之道第一场 共三题

智算之道高校赛第一场
共 10 个测试点
每个测试点 10 分
每个测试点限时 1 秒
运行内存上限 512MB
查看本题最近一次测评结果
小 A 现在站在一个 n 个人的队伍里排队,他们的编号依次为 1∼n,现在她面前有 m 个窗口,其中第 i 个窗口会给出一个数字 ai​,然后将队伍中所有编号为 ai​ 倍数的人带出队伍,请问最后队伍中还剩下多少个人?
输入格式
第一行两个用空格隔开的整数分别表示 n,m
第二行 m 个用空格隔开的整数,其中第 i 个代表 ai​
输出格式
输出一个整数,代表剩下多少个人
数据规模与约定
对于 30% 的数据,1≤n≤100,1≤m≤10
对于 60% 的数据,1≤n≤1000,1≤m≤10
对于 100%的数据,1≤n≤100000,1≤m≤100,1≤ai​≤n
样例输入
10 33 4 5

样例输出
3


开关

共 10 个测试点
每个测试点 10 分
每个测试点限时 1 秒
运行内存上限 512MB
查看本题最近一次测评结果
小 B 面前有 n 个开关,开始时第 i 个开关的状态是 ai​,其中 ai​=1 表示第 i 个开关是开的,ai​=0 表示第 i 个开关是关的。现在 小 B 获得了一种魔法,他可以进行若干次操作,每次操作可以选择一个数 x,然后把 x 号开关及其之前的所有开关状态反转(开变关,关变开),请问小 B 最少需要多少次操作才能使所有开关都变为关的状态。
输入格式
第一行一个整数表示 n
第二行为一个长度为 n 的 01 字符串,即每一位只会是 0 或者 1
输出格式
输出一个整数,表示最少需要多少次操作才能使所有开关都变为关的状态
数据规模与约定
对于 30% 的数据,1≤n≤20
对于 60% 的数据,1≤n≤2000
对于 100% 的数据,1≤n≤200000
样例输入
41001

样例输出
3


字符串

共 10 个测试点
每个测试点 10 分
每个测试点限时 1 秒
运行内存上限 512MB
查看本题最近一次测评结果
给定两个字符串 S 和 T,它们都只由小写字母组成。现在请计算出字符串 S 的本质不同的排列中有多少种是字符串 T 的子串。
本质不同,就是看起来不同,例如 aab 有 3 种本质不同的排列 aab, aba, baa。
输入格式
第一行有一个字符串 S
第二行有一个字符串 T
输出格式
输出一个整数表示字符串 S 的本质不同的排列中有多少种是字符串 T 的子串
数据规模与约定
对于 30% 的数据,1≤∣S∣≤5,1≤∣T∣≤200
对于 60% 的数据,1≤∣S∣≤2000,1≤∣T∣≤2000
对于 100% 的数据,1≤∣S∣≤200000,1≤∣T∣≤200000
样例输入
aababacabaa

样例输出
2
#include
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int b[maxn];
int main(){
	//len是需要检测的窗口的编号集合 
	int n,m,cnt=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(i%a[j]==0) break;
			if(j==m) {
				cnt++;
				break;
			}
		}
	}
	cout<<cnt<<endl;
	return 0;
}
#include
using namespace std;
const int maxn=2e5+5;
char a[maxn];
int main(){
	int n,cnt=0;
	cin>>n;
//	比到第n-2位,最后一位(n-1位)单独判断 
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n-1;i++){
		if(a[i]!=a[i+1]) cnt++;
	}
	if(a[n-1]=='1') cnt++;
	cout<<cnt<<endl;
	return 0;
}
#include
using namespace std;
const int N=2e5+5;
int x,y;
string s,t;
set<string> ss;
int a[30],b[30];
//这题借鉴的大佬的做法
void solve(){
	for(int i=0;i<x;i++) a[s[i]-'a']++;
	for(int i=0;i<y;i++){
		b[t[i]-'a']++;
		if(i>=x-1){
			if(i!=x-1) b[t[i-x]-'a']--;
			if(b[t[i]-'a']==a[t[i]-'a']){
				int  ok=0;
				for(char j='a';j<='z';j++){
					if(b[j-'a']!=a[j-'a']){
						ok=1;
						break;
					}
				}
				if(!ok) ss.insert(t.substr(i-x+1,x));
			}
		}		
	} 
	cout<<ss.size()<<endl;
}
int main(){
	cin>>s>>t;
	x=s.length();
	y=t.length();
	if(x>y){
		cout<<0<<endl;
		return 0;
	}
	solve();
	return 0;
}

你可能感兴趣的:(日常做题)