第一题
小红每次可以把一个字符变成两个字母表中比它小一位的字符。例如,可以把’b’变成两个’a’,可以把z’变成两个’y。
小红希望最终可以生成x个’a’,你能帮小红求出初始的字符串吗?请你输出长度最短的合法字符串,有多解时输出任意即可。
输入描述:
一个正整数x,代表最终的’a’的数量。
1 <= x <= 1000
输出描述:
一个字符串,代表小红操作前的字符串。如果有多个合法解,输出任意一个合法字符串即可。但需要保证输出的是最短字符串。
示例:
输入
5
输出
ca
参考代码:
#include <bits/stdc++.h>
using namespace std;
int helper(int i){
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >> 1);
}
int main(){
int a = 1000;
string str;
while(__builtin_popcount(a) != 1){
int x = helper(a);
str.push_back(char('a' + __builtin_ffs(x) - 1));
a = a - x;
}
str.push_back(char('a' + __builtin_ffs(a) - 1));
cout << str << endl;
return 0;
}
测试
5
ca
6
cb
7
cba
第三题
小红定义一个字符串是好串,当且仅当只有一个字符出现的次数为奇数,其它字母均为偶数。
小红拿到了一个字符串,她想知道该字符串有多少子串是好串?子串的定义:一个字符串取一段连续的区间得到的新字符串。例如"arcaea"的子串有"arc"、"ca"等,但"ara”则不是它的子串。
输入描述:
一个不超过200000的,仅由小写字母组成的字符串。
输出描述:
好子串的数量
用例:
输入:
ababa
输出:
9
参考代码:
#include <bits/stdc++.h>
using namespace std;
unordered_set<string> mp;
int ans = 0;
void Substring(string str){
for(int i = 0; i < str.size(); i++){
for(int j = 1; j <= ((str.substr(i)).size()); j++){
string s = str.substr(i, j);
if(mp.find(s) != mp.end()){
ans++;
}else{
unordered_map<int, int> tr;
for(char ch : s) tr[ch]++;
int jishu = 0;
for(auto &[_, v] : tr){
if(v % 2 != 0){
jishu++;
}
}
if(jishu == 1){
++ans;
mp.insert(s);
}
}
}
}
}
int main(){
string str;
cin >> str;
Substring(str);
cout << ans << endl;
return 0;
}
上述代码没有在考试平台上提交,正确与否不知,只知道测试用例和思路应该没问题!