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;
}