A. Subtle Substring Subtraction
题意:就是Alice先选字符串的一段,选完得分就是这一段字符每个字符序号之和,a是1,b是2,ab和ba都是3,以此类推。Alice可以选偶数个字符,Bob选奇数个。输出谁的分数更大,然后输出他们的分数差
思路:Alice肯定选完或者剩一个,Bob只能选一个或者一个都没
C++
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
void mian()
{
string s;
cin >> s;
int all = 0;
vector<int> score;
for (int i = 0; i < s.size(); i++)
{
all += s[i] - 'a' + 1;
score.push_back(s[i] - 'a' + 1);
}
int alice, bob;
if (s.size() & 1)
{
alice = max(all - score[0], all - score[s.size() - 1]);
bob = min(s[0], s[s.size() - 1]) - 'a' + 1;
}
else
{
alice = all;
bob = 0;
}
if (alice >= bob)
{
cout << "Alice " << alice - bob << endl;
}
else
{
cout << "Bob " << bob - alice << endl;
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
mian();
}
return 0;
}
B. A Perfectly Balanced String?
题意:就是一个字符串,先确定字符串有哪些字符,在每个子串中不同字符个数差不能大于2。
思路:先确定有多少种(t种)字符,然后保证每个长度为t的子串的所有字符都只有一个。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
void mian()
{
string s;
cin >> s;
s = " " + s;
bool st[200] = {0};
int form = 0;
for (int i = 1; i < s.size(); i++)
{
if (!st[s[i]])
{
st[s[i]] = true;
++form;
}
}
bool flag = true;
for (int i = 1; i + form - 1 < s.size(); i++)
{
string t = s.substr(i, form);
bool f[200] = {0};
for (int j = 0; j < form; j++)
{
if (f[t[j]])
{
flag = false;
break;
}
f[t[j]] = true;
}
if (!flag)
{
break;
}
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
mian();
}
return 0;
}
C. Palindrome Basis
题意:给你一个数,找出这个数由若干个回文数相加得到,这样的方案有多少种。
思路:先暴力找所有范围内的回文数,也就几百个,然后可以转换为一个完全背包问题。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
vector<int> f(N, 0);
vector<int> a;
bool check(int k)
{
string st = to_string(k);
string ed = st;
reverse(ed.begin(), ed.end());
return st == ed;
}
void init()
{
for (int i = 1; i <= N; i++)
{
if (check(i))
a.push_back(i);
}
f[0] = 1;
for (int i = 0; i < a.size(); i++)
{
for (int j = a[i]; j < N; j++)
{
f[j] = (f[j] + f[j - a[i]]) % mod;
}
}
}
void mian()
{
int n;
cin >> n;
cout << f[n] << endl;
}
int main()
{
init();
int T;
cin >> T;
while (T--)
{
mian();
}
return 0;
}