首页 > 其他分享 >AtCoder Beginner Contest 287 A-F 题解

AtCoder Beginner Contest 287 A-F 题解

时间:2023-02-25 15:58:05浏览次数:47  
标签:AtCoder include ver int 题解 ++ return now 287

比赛链接

A - Majority

先这样再那样最后这样,就是这样。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n, a;
char s[15];
int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++) {
		scanf("%s", s);
		if(s[0] == 'F') a ++;
	}
	if(a > n - a) puts("Yes");
	else puts("No");
	
	return 0;
}

B - Postal Card

直接记录每个串的后三位,用 bool 数组记录是否出现,

循环枚举就好。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1005;
int n, m, ans;
bool vis[N];
char s[10], t[N][10];
int main() {
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i ++) {
		scanf("%s", t[i]);
	}
	
	for(int i = 1; i <= m; i ++) {
		scanf("%s", s);
		int tmp = 0;
		for(int j = 0; j < 3; j ++) tmp = tmp * 10 + s[j] - '0';
		vis[tmp] = 1;
	}
	
	for(int i = 1; i <= n; i ++) {
		int tmp = 0;
		for(int j = 3; j < 6; j ++) tmp = tmp * 10 + t[i][j] - '0';
		if(vis[tmp]) ans ++;
	}
	printf("%d", ans);
	return 0;
}

C - Path Graph?

分析可得,满足条件的边数为 n - 1 且图中不存在度数 > 2 的点,

然后继续递归判断。

完了。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 2e5 + 5;

int n, m, in[N];

int tot, head[N], nex[N << 1], to[N << 1];

void add(int x, int y) {
	to[++tot] = y, nex[tot] = head[x], head[x] = tot;
}
queue<int> q;
bool vis[N];
void dfs() {
	q.push(1), vis[1] = 1;
	int now, ver;
	while(!q.empty()) {
		now = q.front(), q.pop();
		for(int i = head[now]; i; i = nex[i]){
			ver = to[i];
			if(!vis[ver]) {
				vis[ver] = 1;
				q.push(ver);
			}
		}
	}
}

int main() {
	scanf("%d %d", &n, &m);
	int u, v;
	for(int i = 1; i <= m; i ++) {
		scanf("%d %d", &u, &v);
		add(u, v), add(v, u);
		in[u] ++, in[v] ++;
	}
	if(n - 1 != m) {
		puts("No");
		return 0;
	}
	for(int i = 1; i <= n; i ++) {
		if(in[i] > 2) {
			puts("No");
			return 0;
		}
	}
	dfs();
	
	for(int i = 1; i <= n; i ++) {
		if(!vis[i]) {
			puts("No");
			return 0;
		}
	}
	puts("Yes");
	return 0;
}

D - Match or Not

双指针判断两个字符串的公共前后缀长度,再逐一枚举 x 进行比较。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 3e5 + 5;

int n, m;
char s[N], t[N]; 

bool check(int x, int y) {
	return s[x] == t[y] || s[x] == '?' || t[y] == '?';
}

int main() {
	scanf("%s %s", s, t);
	n = strlen(s) - 1, m = strlen(t);
	int l = 0, r = 0;
	for(int i = 0; i < m; i ++) {
		if(check(i, i)) l ++;
		else break;
	}
	for(int i = m - 1; i >= 0; i --) {
		if(check(n, i)) r ++, n --;
		else break;
	}
	
	for(int i = 0; i <= m; i ++) {
		if(i <= l && m - i <= r) puts("Yes");
		else puts("No");
	}
	
	return 0;
}

E - Karuta

建立 trie 树,每个点标记在所有字符串中出现的次数,

完了再搜一遍,当记录次数为 1 时,说明能遍历到当前位置的字符串只有它自己,

于是输出。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;

const int N = 5e5 + 5;
vector<string> s;
string str;
int n, tot, num[N], tr[N][26];
void ins(string &s) {
	int v, len = s.length(), now = 0;
	for(int i = 0; i < len; i ++) {
		v = s[i] - 'a';
		if(!tr[now][v]) tr[now][v] = ++tot;
		now = tr[now][v];
		num[now] ++;
	}
}

int query(string &s) {
	int res = 0, len = s.length(), v, now = 0;
	for(int i = 0; i < len; i ++) {
		v = s[i] - 'a';
		now = tr[now][v];
		if(num[now] == 1) return res;
		res ++;
	}
	return res;
}

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++) {
		cin >> str;
		s.push_back(str);
		ins(str);
	}
	for(int i = 0; i < n; i ++) {
		printf("%d\n", query(s[i]));
	}
	return 0;
}

F - Components

树形 DP。

(忘了)

点击查看代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;
#define int long long
const int N = 5005, mod = 998244353;

int n, dp[N][N][2], f[N][2], siz[N];

vector<int> G[N];

void dfs(int x, int fa) {
	dp[x][0][0] = dp[x][1][1] = siz[x] = 1;
	int ver;
	for(int i = 0; i < G[x].size(); i ++) {
		ver = G[x][i];
		if(ver == fa) continue;
		dfs(ver, x);
		for(int j = 0; j <= siz[x] + siz[ver]; j ++) {
			f[j][0] = dp[x][j][0], f[j][1] = dp[x][j][1];
			dp[x][j][0] = dp[x][j][1] = 0;
		}
		for(int j = siz[x] + siz[ver]; j >= 0; j --) {
			for(int k = max(0ll, j - siz[x]); k <= min(j, siz[ver]); k ++) {
				dp[x][j][0] = (dp[x][j][0] + (dp[ver][k][0] + dp[ver][k][1]) % mod * f[j - k][0] % mod) %mod;
				dp[x][j][1] = (dp[x][j][1] + dp[ver][k][0] * f[j - k][1] % mod + dp[ver][k + 1][1] * f[j - k][1]) % mod;
			}
		}
		siz[x] += siz[ver];
	}
}

signed main() {
	scanf("%lld", &n);
	int u, v;
	for(int i = 1; i < n; i ++) {
		scanf("%lld %lld", &u, &v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(1, 1);
	for(int i = 1; i <= n; i ++) printf("%lld\n", (dp[1][i][0] + dp[1][i][1]) % mod);
	return 0;
}

标签:AtCoder,include,ver,int,题解,++,return,now,287
From: https://www.cnblogs.com/Spring-Araki/p/17154569.html

相关文章

  • AtCoder Beginner Contest 286 A-G 题解
    比赛链接A-RangeSwap根据题意,分段输出。点击查看代码#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintN=105;intn,......
  • P8720 [蓝桥杯 2020 省 B2] 平面切分 题解
    前言建议本题评黄,因为需要较强的数学能力。如果格式炸了去这里看哦题意给出\(N\)条直线的解析式\(y=kx+b\),求出这些直线把平面分成了几部分。思路看到这道题我们......
  • [六省联考 2017] 组合数问题 题解
    题目描述组合数\(C_n^m\)表示的是从\(n\)个互不相同的物品中选出\(m\)个物品的方案数。举个例子,从\((1,2,3)\)三个物品中选择两个物品可以有\((1,2)\),\((1,......
  • AtCoder Beginner Contest 288 解题报告
    AtCoderBeginnerContest288解题报告\(\text{ByDaiRuiChen007}\)A.ManyA+BProblems直接模拟即可时间复杂度\(\Theta(n)\)#include<bits/stdc++.h>usingname......
  • 2.25 校内模拟赛 题解
    好消息:签到题首杀。坏消息:只会签到题。\(\text{contestid:726}\)A.随机\(\text{problemid:2307}\)B.回文路径\(\text{problemid:3772}\)成功首杀。看到回......
  • AtCoder Beginner Contest 282 A-F 题解
    比赛链接A-GeneralizedABC额,对,是的,没错,先这样再那样然后这样就是这样。点击查看代码#include<cstdio>intn;intmain(){ scanf("%d",&n); for(inti=0;......
  • #68. 「NOIP2004」津津的储蓄计划 题解
    #68.「NOIP2004」津津的储蓄计划题解题目传送门题目知识点模拟题目分析非常的“明显”,这是一道模拟题。题意说明有可能在某个月的月初,津津手中的钱加上这个月妈妈......
  • #119. 最大整数 题解
    #119.最大整数题解题目传送门题目知识点字符串+贪心题意说明设有n个正整数(n<=20),将它们连接成一排,组成一个最大的多位整数。(题目简介明了,一看就是出题人懒得写题目背......
  • #160. 「NOIP2004 普及组」不高兴的津津 题解
    #160.「NOIP2004普及组」不高兴的津津题解题目传送门题目知识点枚举题意说明津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为......
  • #373. 「USACO1.1」Friday the Thirteenth 题解
    #373.「USACO1.1」FridaytheThirteenth题解题目传送门题目知识点模拟+数学闰年知识点题意说明写一个程序来计算在n年里13日落在星期一,星期二......星期日的次数......