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