QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#168251#2476. Pizzo CollectorsLaStataleBlue#TL 0ms1648kbC++141.1kb2023-09-08 01:32:582023-09-08 01:33:00

Judging History

你现在查看的是最新测评结果

  • [2023-09-08 01:33:00]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:1648kb
  • [2023-09-08 01:32:58]
  • 提交

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

output:


result: