牛客练习赛113

文章提供了两道编程题的解析,一是关于基环树的最小直径问题,指出当节点数大于3时,最优结构是一个顶点连接其他所有顶点,使得直径为2。二是回文串的构建,讨论了如何替换字符串中的问号以形成回文串,考虑了不同情况下的替换策略和计数。
摘要由CSDN通过智能技术生成

A

小红的基环树

题意:

定义基环树为n个节点、n条边的、没有自环和重边的无向连通图。

定义一个图的直径是任意两点最短路的最大值。

小红想知道,n个节点构成的所有基环树中,最小的直径是多少?

题解:

除了3个节点时,只有一种基环树,最小直径为1。

节点数大于三时都可变为:

 如图所示的类似结构。

即一个顶点,链接了其他n-1个点,这样任意两个点的直径都不会超过2(由端点到顶点再到另一个端点)。

所以当n=3时答案为1,当n>3时答案为2。

代码:

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<math.h>
using namespace std;
int n;
int main()
{
	cin >> n;
	if (n == 3)
		cout << 1;
	else
		cout << 2;
	return 0;
}

B

小红的回文串

题意:
有一个字符串,字符串仅由小写字母和'?'字符组成。可以将每个'?'替换成任意小写字母。使字符串变为回文字符串,求有多少种不同的方案,答案对1e9+7取模。

题解:

注意对各种情况的讨论即可。

1.如果对称位置的字符不相等,且不都不是问号,直接输出0。

2.令sum=1,如果对称位置的字符都是问号,则sum*=26(因为问号可以变成26种字母,都为问号的情况下,多了26种组合)。

3.答案注意取模。

代码:

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<math.h>
using namespace std;
const int N = 1e9 + 7;
string s;
int main()
{
	long long int sum = 1;
	cin >> s;
	for (int i = 0; i < size(s) / 2; i++)
	{
		if (s[i] != s[size(s) - i - 1]&&s[i]!='?'&&s[size(s)-i-1]!='?')
		{
			cout << 0;
			return 0;
		}
		if (s[i] == '?' && s[size(s) - i - 1] == '?')
		{
			sum = (sum % N * 26) % N;
		}
	}
	if (size(s) % 2 != 0 && s[size(s) / 2] == '?')
		sum = (sum % N * 26) % N;
	cout << sum;
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值