AtCoder Beginner Contest 295——A-D讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提!

Hello, 大家好哇!本初中生蒟蒻讲解一下AtCoder Beginner Contest 295这场比赛的A-D题

===========================================================================================

A - Probably English

Problem Statement

You are given N N N strings W 1 , W 2 , … , W N W_1,W_2,\dots,W_N W1,W2,,WN consisting of lowercase English letters.

If one or more of these strings equal and, not, that, the, or you, then print Yes; otherwise, print No.

Constraints

N N N is an integer between 1 1 1 and 100 100 100, inclusive.
1 ≤ ∣ W i ∣ ≤ 50 1 \le |W_i| \le 50 1Wi50 ( ∣ W i ∣ |W_i| Wi is the length of W i W_i Wi.)
W i W_i Wi consists of lowercase English letters.

Input

The input is given from Standard Input in the following format:
N N N
W 1 W_1 W1 W 2 W_2 W2 … \dots W N W_N WN

Output

Print the answer.

Sample Input 1

10
in that case you should print yes and not no

Sample Output 1

Yes
We have, for instance, W 4 = W_4= W4= you, so you should print Yes.

Sample Input 2

10
in diesem fall sollten sie no und nicht yes ausgeben

Sample Output 2

No
None of the strings W i W_i Wi equals any of and, not, that, the, and you.


思路

呜呜呜,太简单


代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define endl '\n'
#define psb(i) push_back(i)
#define ppb() pop_back()
#define psf(i) push_front(i)
#define ppf() pop_front()
#define ps(i) push(i)

using namespace std;

typedef pair<int, int> PII;

string cmp[6] = {"and", "not", "that", "the", "you"};

inline int read()
{
    int w = 1, s = 0;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
    
    return w * s;
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    
    int n;
    string c;
    
    cin >> n;
    
    while (n --)
    {
    	cin >> c;
    	for (int i = 0; i < 5; i ++)
    		if (c == cmp[i])
    		{
    			cout << "Yes" << endl;
    			return 0;
    		}
    }
    
    cout << "No" << endl;
    
    return 0;
}

B - Bombs

原题

Problem Statement

We have a board with R R R rows running horizontally and C C C columns running vertically. Let ( i , j ) (i,j) (i,j) denote the square at the i i i-th row from the top and j j j-th column from the left.
You are given characters B i , j B_{i,j} Bi,j representing the current states of ( i , j ) (i,j) (i,j).
. represents an empty square; # represents a square with a wall; 1, 2, … \dots , 9 represent a square with a bomb of power 1 , 2 , … , 9 1,2,\dots,9 1,2,,9, respectively.
At the next moment, all bombs will explode simultaneously.
When a bomb explodes, every square whose Manhattan distance from the square with the bomb is not greater than the power of the bomb will turn into an empty square.
Here, the Manhattan distance from ( r 1 , c 1 ) (r_1,c_1) (r1,c1) to ( r 2 , c 2 ) (r_2,c_2) (r2,c2) is ∣ r 1 − r 2 ∣ + ∣ c 1 − c 2 ∣ |r_1-r_2|+|c_1-c_2| r1r2+c1c2.
Print the board after the explosions.

Constraints

1 ≤ R , C ≤ 20 1\leq R,C \leq 20 1R,C20
R R R and C C C are integers.
Each B i , j B_{i,j} Bi,j is one of ., #, 1, 2, … \dots , 9.

Input

The input is given from Standard Input in the following format:
R R R C C C
B 1 , 1 B 1 , 2 … B 1 , C B_{1,1}B_{1,2}\dots B_{1,C} B1,1B1,2B1,C
⋮ \vdots
B R , 1 B R , 2 … B R , C B_{R,1}B_{R,2}\dots B_{R,C} BR,1BR,2BR,C

Output

Print R R R lines representing the board after the explosions. Use the format used in the input (do not print R R R or C C C).

Sample Input 1

4 4
.1.#
###.
.#2.
#.##

Sample Output 1

…#
#…

#…
Figure representing the explosion ranges of bombs
The explosion of the bomb at ( 1 , 2 ) (1,2) (1,2) will turn the blue squares and purple squares in the above figure into empty squares.
The explosion of the bomb at ( 3 , 3 ) (3,3) (3,3) will turn the red squares and purple squares in the above figure into empty squares.
As seen in this sample, the explosion ranges of bombs may overlap.

Sample Input 2

2 5
…#.#
###.#

Sample Output 2

…#.#
###.#
There may be no bombs.

Sample Input 3

2 3
11#

Sample Output 3


…#

Sample Input 4

4 6
#.#3#.
###.#.
##.###
#1…#.

Sample Output 4


#…
#…#
…#.


思路

我们直接四重循环,先循环每个炸弹,再循环能炸到的点。


代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define endl '\n'
#define psb(i) push_back(i)
#define ppb() pop_back()
#define psf(i) push_front(i)
#define ppf() pop_front()
#define ps(i) push(i)

using namespace std;

typedef pair<int, int> PII;

const int N = 2e1 + 10;

int n, m;
char a[N][N];

inline int read()
{
    int w = 1, s = 0;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
    
    return w * s;
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    
    cin >> n >> m;
    
    for (int i = 1; i <= n; i ++)
    	for (int j = 1; j <= m; j ++)
    		cin >> a[i][j];
    		
    for (int x1 = 1; x1 <= n; x1 ++)
    	for (int y1 = 1; y1 <= m; y1 ++)
    	{
    		if (!isdigit(a[x1][y1])) continue;
    		int t = a[x1][y1] - '0';
    		for (int x2 = 1; x2 <= n; x2 ++)
    			for (int y2 = 1; y2 <= m; y2 ++)
    				if ((!isdigit(a[x2][y2]) || (x1 == x2 && y1 == y2)) && abs(x1 - x2) + abs(y1 - y2) <= t)
    					a[x2][y2] = '.';//, printf("(%d, %d)->(%d, %d)\n", x1, y1, x2, y2);
    	}
    	
    for (int i = 1; i <= n; i ++)
    {
    	for (int j = 1; j <= m; j ++)
    		cout << a[i][j];
    	cout << endl;
    }
    return 0;
}

C - Socks

原题

Problem Statement

You have N N N socks. The color of the i i i-th sock is A i A_i Ai.
You want to perform the following operation as many times as possible. How many times can it be performed at most?
Choose two same-colored socks that are not paired yet, and pair them.

Constraints

1 ≤ N ≤ 5 × 1 0 5 1\leq N \leq 5\times 10^5 1N5×105
1 ≤ A i ≤ 1 0 9 1\leq A_i \leq 10^9 1Ai109
All values in the input are integers.

Input

The input is given from Standard Input in the following format:
N N N
A 1 A_1 A1 A 2 A_2 A2 … \dots A N A_N AN

Output

Print an integer representing the answer.

Sample Input 1

6
4 1 7 4 1 4

Sample Output 1

2
You can do the operation twice as follows.
Choose two socks with the color 1 1 1 and pair them.
Choose two socks with the color 4 4 4 and pair them.
Then, you will be left with one sock with the color 4 4 4 and another with the color 7 7 7, so you can no longer do the operation.
There is no way to do the operation three or more times, so you should print 2 2 2.

Sample Input 2

1
158260522

Sample Output 2

0

Sample Input 3

10
295 2 29 295 29 2 29 295 2 29

Sample Output 3

4


思路

直接看看有多少个重复的颜色就行~~~


代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define psb(i) push_back(i)
#define ppb() pop_back()
#define psf(i) push_front(i)
#define ppf() pop_front()
#define ps(i) push(i)

using namespace std;

typedef pair<int, int> PII;

const int N = 5e5 + 10;

int n;
int a[N];
unordered_map<int, int> cnt;

inline int read()
{
    int w = 1, s = 0;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
    
    return w * s;
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    
    cin >> n;
    
    for (int i = 1; i <= n; i ++)
    	cin >> a[i], cnt[a[i]] ++;
    	
    int res = 0;
    for (auto c : cnt)
    	res += (c.second / 2);
    	
    cout << res << endl;
    
    return 0;
}

D - Three Days Ago

原题

Problem Statement

The string 20230322 can be rearranged into 02320232, which is a repetition of 0232 twice.

Similarly, a string consisting of digits is said to be happy when it can be rearranged into (or already is) a repetition of some string twice.

You are given a string S S S consisting of digits. Find the number of pairs of integers ( l , r ) (l,r) (l,r) satisfying all of the following conditions.
1 ≤ l ≤ r ≤ ∣ S ∣ 1 \le l \le r \le |S| 1lrS. ( ∣ S ∣ |S| S is the length of S S S.)
The (contiguous) substring formed of the l l l-th through r r r-th characters of S S S is happy.

Constraints

S S S is a string consisting of digits whose length is between 1 1 1 and 5 × 1 0 5 5 \times 10^5 5×105, inclusive.

Input

The input is given from Standard Input in the following format:
S S S

Output

Print an integer representing the answer.

Sample Input 1

20230322

Sample Output 1

4
We have S = S= S= 20230322.
Here are the four pairs of integers ( l , r ) (l,r) (l,r) that satisfy the condition: ( 1 , 6 ) (1,6) (1,6), ( 1 , 8 ) (1,8) (1,8), ( 2 , 7 ) (2,7) (2,7), and ( 7 , 8 ) (7,8) (7,8).

Sample Input 2

0112223333444445555556666666777777778888888889999999999

Sample Output 2

185
S S S may begin with 0.

Sample Input 3

3141592653589793238462643383279502884197169399375105820974944

Sample Output 3

9


思路

本题主要意思是有多少个区间满足区间内的值随便排列能够组成两个相同的序列。例如:202303,就可以排列成230230,这就是一个满足条件的序列!通过观察,要想凑出两个相同的小序列,必须序列中的每一个数出现的次数都是偶数,这样才能平均的分配到两个小序列中。
知道这一点之后,明确一下本题的目标:找到有多少个区间其中的数出现的次数都是偶数,这里我们可以用到异或(这一篇写的很好,值得一看)。因为,每一个数只能取1-9,所以我们用一个01序列来表示他们的奇偶(0表示偶数,1表示奇数)。

例如:S=20230322

R[i]表示前i个数中每个数出现的次数的奇偶
i = 0  0000000000
i = 1  0010000000
i = 2  1010000000
i = 3  1000000000
i = 4  1001000000
i = 5  0001000000
i = 6  0000000000
i = 7  0010000000
i = 8  0000000000

R i = R j ( i < j ) R_i = R_j(i < j) Ri=Rj(i<j),则从 i + 1 i+1 i+1 j j j一定是一个满足条件的序列。

证明:从 i + 1 i + 1 i+1 j j j的奇偶性序列通过前缀和的思想,其实就是 R j − R i ( R j ≥ R i ) R_j - R_i(R_j \geq R_i) RjRi(RjRi)(注意不是i+1, 因为要取i+1),若 R j − R i R_j - R_i RjRi中所有的数全部是偶数,那么序列中的体现就是0000000000,也就是 R j − R i = 0 R_j - R_i = 0 RjRi=0,即: R i = R j R_i = R_j Ri=Rj,则从 i + 1 i+1 i+1 j j j一定是一个满足条件的序列。

所以找到所有的 R i = R j R_i = R_j Ri=Rj的个数,即为答案!


代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define psb(i) push_back(i)
#define ppb() pop_back()
#define psf(i) push_front(i)
#define ppf() pop_front()
#define ps(i) push(i)

using namespace std;

typedef pair<int, int> PII;

string s;
unordered_map<int, int> times;
int state;
int res = 0;

inline int read()
{
    int w = 1, s = 0;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
    
    return w * s;
}

signed main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    
    cin >> s;
    
    times[0] = 1; //全是0就是一种可行的方案!
    for (int i = 0; i < (int)s.size(); i ++)
    {
    	state ^= (1 << (s[i] - '0')); //我们可以通过二进制来存储奇偶性序列
    	res += times[state]; //每一次加上之前的所有可以的,因为对于每一个小于j的i,都要记录
    	times[state] ++; //出现了一次,不断累加
    }
    
    cout << res << endl;
    
    return 0;
}

今天就到这里了!

大家有什么问题尽管提,我都会尽力回答的!

吾欲您伸手,点的小赞赞。吾欲您喜欢,点得小关注!

(这两天比赛有点多,直到现在才发出来,非常抱歉~~~)

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值