AtCoder Beginner Contest 285

A - Edge Checker 2

原题链接

题意

在下图中确定是否存在直接连接编号点 \(a\) 和 \(b\) 的线段。

分析

这是一个二叉树,不难发现,当且仅当 \(b\) 为 \(a\times 2\) 或 \(a\times 2+1\) 时,有直接连接 \(a\) 和 \(b\) 的线段。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	if(b==a*2||b==a*2+1) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
        return 0;
}

B - Longest Uncommon Prefix

原题链接

题意

给你长度为 \(N\) 的一个由小写英文字母组成字符串 \(S\)。\(S\) 的第 \(x(1\le x\le N)\) 个字符是 \(S_x\)。

对于每个 \(i=1,2,\ldots,N−1\),找到最大非负整数 \(l\) 满足以下所有条件:

  • \(l+i\le N\),
  • 对于所有整数 \(k(1\le k \le l)\) 使得 \(S_k\ne S_{k+i}\)。

请注意 \(l=0\) 总是满足条件。

分析

这道题没什么巧方法,就是暴力,依题意模拟。

  • 对于每个 \(i\),我们就从 \(N-i\) 一直枚举到 \(0\),用 \(j\) 表示,
  • 对于每个 \(j\) ,我们再从 \(1\) 到 \(j\) 枚举 \(k\),如果符合条件,就退出循环,此时的 \(j\) 就是最终结果 \(l\)。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main()
{
	cin>>n>>s;
	for(int i=0;i<s.size()-1;i++)
	{
		int ii=i+1;
		int l;
		for(int j=n-ii;j>=0;j--)
		{
			bool flag=0;
			for(int k=1;k<=j;k++)
			{
				if(s[k-1]==s[k+ii-1])
				{
					flag=1;
					break;
				}
			}
			if(flag==0)
			{
				l=j;
				break;
			}
		}
		printf("%d\n",l);
	}
        return 0;
}

C - abc285_brutmhyhiizp

原题链接

题意

有一个序列是按A,B,\(\ldots\),AA,AB,\(\ldots\),AAA,\(\ldots\) 的顺序排列。

给出一个字符串,求它是第几项。

保证结果小于 \(10^{16}\)。

分析

找一下规律。

  • A:\(1\times1\)
  • B:\(2\times1\)
  • AA:\(1\times 1+1\times 26\)
  • AB:\(2\times 1+1\times 26\)
  • AAA:\(1\times 1+1\times 26+1\times 26^2\)

找到规律了吗?

从最后一位倒着开始看,发现 \(ans\) 每次加上(s[i]-'A'+1)*(long long)pow(26,ii);

注意:

  • 这里的 \(ii\) 是s.size()-1-i,表示是倒着数的第几项再减一。
  • pow要强制转换为long long类型。

代码

#include<bits/stdc++.h>
using namespace std;
string s;
long long ans=0,ii;
int main()
{
	cin>>s;
	for(int i=s.size()-1;i>=0;i--)
	{
		ii=s.size()-i-1;
		ans=ans+(s[i]-'A'+1)*(long long)pow(26,ii);
	}
	cout<<ans<<endl;
        return 0;
}

感谢您的阅读,您的点赞与评论是我创作最大的动力。

luogu:PineappleSummer

csdn:PineappleSummer

cnblogs:PineappleSummer

可以关注我吗qwq

posted @ 2023-01-16 11:07  PineappleSummer  阅读(100)  评论(2)    收藏  举报