牛客笔试题目1

【偶串】如果一个字符串由两个相同字符串连接而成,就称这个字符串是偶串。例如"xyzxyz"和"aaaaaa"是偶串,但是"ababab"和"xyzxy"却不是。 牛牛现在给你一个只包含小写字母的偶串s,你可以从字符串s的末尾删除1个或者多个字符,保证删除之后的字符串还是一个偶串,牛牛想知道删除之后得到最长偶串长 度是多少。

输入描述:

输入包括一个字符串s,字符串长度length(2 ≤ length ≤ 200),保证s是一个偶串且由小写字母构成

输出描述:

输出一个整数,表示删除之后能得到的最长偶串长度是多少。保证测试数据有非零解

示例1: 输入abaababaab    

              输出  6

#include<iostream>
#include<string>
using namespace std;
bool isEven(string str)
{
	int len = str.size();
	int j = len / 2;
	int i = 0;
	for (; i < len / 2, j < len; i++, j++)
	{
		if (str[i] != str[j])
			return false;
	}
	return true;
}
int main()
{
	string str;
	cin >> str;
	int len = str.size();
	str = str.substr(0, len - 2);
	while (!isEven(str))
	{
		len = str.size();
		str = str.substr(0,  len- 2);
	}
	cout << str.size() << endl;
	return 0;
}

 

题目:

牛牛和羊羊在玩一个有趣的猜数游戏。在这个游戏中,牛牛玩家选择一个正整数,羊羊根据已给的提示猜这个数字。第i个提示是"Y"或者"N",表示牛牛选择的数是否是i的倍数。例如,如果提示是"YYNYY",它表示这个数使1,2,4,5的倍数,但不是3的倍数。注意到一些提示会出现错误。例如: 提示"NYYY"是错误的,因为所有的整数都是1的倍数,所以起始元素肯定不会是"N"。此外,例如"YNNY"的提示也是错误的,因为结果不可能是4的倍数但不是2的倍数。现在给出一个整数n,表示已给的提示的长度。请计算出长度为n的合法的提示的个数。例如 n = 5:合法的提示有:YNNNN YNNNY YNYNN YNYNY YYNNN YYNNYYYNYN YYNYY YYYNN YYYNY YYYYN YYYYY所以输出12

输入描述:
输入包括一个整数n(1 ≤ n ≤ 10^6),表示已给提示的长度。
输出描述:
输出一个整数,表示合法的提示个数。因为答案可能会很大,所以输出对于1000000007的模
输入例子1:
5
输出例子1:
12

除1以外,每个位置上的数有以下几种情况:

1、如果质因子超过一个,则该位置上的字符是被唯一确定的。(这种情况下的数字都可以由几个素数或素数的K次幂而得)

                例如数字6:如果2,3为NY、YN、NN,则位置6上的字符为N;如果2,3为YY,则位置6上的字符为Y

                例如数字12:如果3,4为NY、YN、NN,则位置12上的字符为N,如果3,4为YY,则位置12上的字符为Y

2、只包含一个质因数的数字。可以按质因子分类,因为包含不同质因子的数不会相互影响,这样可以使用乘法原理计数。因为其它数字都可以由范围内的素数及其K次幂的位置的情况这些组合而来,所以我们只需要考虑范围内的素数及其K次幂的位置的情况。

               例如:n = 64 考虑2的次幂:

                         如果64是Y,那么32 16 8 4 2都要是Y;

          如果64是N,32是Y,16 8 4 2都要是Y;

       如果64 32是N,16是Y,8 4 2都要是Y;

       ...

       依次类推一共有7种情况

              因此,在小于n的范围内,一个素数若为a,它的幂有m个,那么有如下规律(第m个为a的m次幂):

 

第m个YNNNN
第m-1个YYNNN
...YYYNN
2YYYYN
1YYYYY/N

所以,对于素数a及其幂来说,共有m+1种组合。

将n以内每个质数的情况数相乘即得合法字符串的个数。

const int maxn = 1e6 + 5;
const int mod = 1e9 + 7;
int v[maxn];

int main() {
	int n;
	cin >> n;
	long long ans = 1;
	for (int i = 2; i <= n; i++) 
	{
		if (v[i]) continue;
		for (int j = 2*i; j <= n; j += i)
			v[j] = 1;
		int tmp = n, cnt = 0;
		while (tmp >= i)  //计算小于n的数中,i的幂的个数
		{
			tmp /= i;
			cnt++;
		}
		ans = ans * (cnt + 1) % mod;
	}
	cout << ans << endl;
	return 0;
}

题目: 

【制造回文】牛牛有一些字母卡片,每张卡片上都有一个小写字母,所有卡片组成一个字符串s。牛牛一直认为回文这种性质十分优雅,于是牛牛希望用这些卡片拼凑出
一些回文串,但是有以下要求:
1、每张卡片只能使用一次
2、要求构成的回文串的数量最少
牛牛想知道用这些字母卡片,最少能拼凑出多少个回文串。
例如: s = "abbaa",输出1,因为最少可以拼凑出"ababa"这一个回文串
s = "abc", 输出3,因为最少只能拼凑出"a","b","c"这三个回文串
输入描述:输入包括一行,一个字符串s,字符串s长度length(1 ≤ length ≤ 1000).
                s中每个字符都是小写字母
输出描述:输出一个整数,即最少的回文串个数。
示例1:
输入:abc
输出:3
 

#include<iostream>
#include<string>
using namespace std;



int main()
{
	int ch[26] = { 0 };
	string str;
	cin >> str;
	int ans = 0;
	for (int i = 0; i < str.size(); i++)
	{
		ch[str[i] - 'a']++;
	}
	for (int i = 0; i < 26; i++)
	{
		ch[i] %= 2;
	}
	for (int i = 0; i < 26; i++)
	{
		ans += ch[i];
	}
	if (ans == 0)
	{
		cout << 1 << endl;
	}
	else
	{
		cout << ans << endl;
	}
	return 0;

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值