【偶串】如果一个字符串由两个相同字符串连接而成,就称这个字符串是偶串。例如"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个 | Y | N | N | N | N |
第m-1个 | Y | Y | N | N | N |
... | Y | Y | Y | N | N |
2 | Y | Y | Y | Y | N |
1 | Y | Y | Y | Y | Y/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;
}