QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#168251 | #2476. Pizzo Collectors | LaStataleBlue# | TL | 0ms | 1648kb | C++14 | 1.1kb | 2023-09-08 01:32:58 | 2023-09-08 01:33:00 |
Judging History
answer
#include <cstdio>
#include <algorithm>
#include <utility>
using namespace std;
typedef long long ll;
constexpr int MAXN = 100'005;
int n;
int prime;
char s[MAXN];
int pizzo[100];
int maxpizzo = 0;
pair<ll, char> util(const int x, const int d)
{
if (d == n)
return {pizzo[s[x]], s[x]};
ll ans = 0;
char cchar = '?';
for (int i = 0; i < prime; i++)
{
const auto r = util((x + i * d) % n, d * prime);
ans += r.first;
if (r.second == '?')
;
else if (cchar == '?')
cchar = r.second;
else if (r.second != cchar)
cchar = '!';
}
int val = 0;
if (cchar == '?')
val = maxpizzo;
else if (cchar != '!')
val = pizzo[cchar];
const int elems = n / d;
int e = 0;
for (int i = d; i <= n; i *= prime)
e += elems;
ll ans2 = (ll)val * e;
return {max(ans, ans2), cchar};
}
int main()
{
int n, k;
scanf("%d %s %d", &n, s, &k);
::n = n;
for (int i = 0; i < k; i++)
{
char c;
int v;
scanf(" %c %d ", &c, &v);
pizzo[c] = v;
maxpizzo = max(maxpizzo, v);
}
pizzo['?'] = maxpizzo;
for (int i = 2; i < n; i++)
if (n % i == 0)
{
prime = i;
break;
}
printf("%lld\n", util(0, 1).first);
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 1648kb
input:
8 ?A?B?A?C 3 A 1 B 1000 C 100000
output:
1301004
result:
ok single line: '1301004'
Test #2:
score: 0
Accepted
time: 0ms
memory: 1640kb
input:
4 ABCD 4 A 4 B 3 C 2 D 1
output:
10
result:
ok single line: '10'
Test #3:
score: -100
Time Limit Exceeded
input:
2 AB 2 A 1 B 2