Submission #116090

#TimeUsernameProblemLanguageResultExecution timeMemory
116090davitmargPaint By Numbers (IOI16_paint)C++17
80 / 100
9 ms2560 KiB
/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <bitset>
#include <stack>
#include <cassert>
#include <iterator>
#include <ctype.h>
#include <fstream>
#define mod 998244353ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(),v.end()
using namespace std;

int n,k;
string s,ans;
vector<int> a;
bool pr[102][102][102], sf[102][102][102];

int Main()
{
	k = a.size();
	a.PB(0);
	reverse(all(a));
	a.PB(0);
	reverse(all(a));

	pr[0][0][1] = 1;

	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= n; j++)
			for (int p = 1; p <= k+1; p++)
			{
				if (a[p] < j || pr[i][j][p] == 0)
					continue;
				if (s[i + 1] == 'X' || s[i + 1] == '.')
					pr[i + 1][j + 1][p] |= (j + 1 <= a[p]);
				if (s[i + 1] == '_' || s[i + 1] == '.')
				{
					pr[i + 1][0][p+1] |= (j == a[p]);
					pr[i + 1][0][p] |= (j == 0);
				}
			}

	sf[n+1][0][k] = 1;
	for (int i = n+1; i >= 1; i--)
		for (int j = 0; j <= n; j++)
			for (int p = k; p >= 0; p--)
			{
				if (a[p] < j || sf[i][j][p] == 0)
					continue;
				if (s[i - 1] == 'X' || s[i - 1] == '.')
					sf[i - 1][j + 1][p] |= (j + 1 <= a[p]);
				if (s[i - 1] == '_' || s[i - 1] == '.')
				{
					if(p-1>=0)
						sf[i - 1][0][p - 1] |= (j == a[p]);
					sf[i - 1][0][p] |= (j == 0);
				}
			}
	ans = s;
	for (int i = 0; i <= n; i++)
	{
		if (s[i] != '.')
		{
			ans[i] = s[i];
			continue;
		}
		int cnt[2] = { 0,0 };
		for (int j = 0; j <= n; j++)
			for (int p = 1; p <= k+1; p++)
			{
				if (a[p]<j || !pr[i][j][p])
					continue;
				cnt[(bool)j] += sf[i + 1][a[p]-j][p];
				if(j==0)
					cnt[(bool)j] += sf[i + 1][0][p-1];
			}
		if (cnt[0] && cnt[1])
			ans[i] = '?';
		else if (cnt[0])
			ans[i] = '_';
		else
			ans[i] = 'X';
	}
	ans.pop_back();
	reverse(all(ans));
	ans.pop_back();
	reverse(all(ans));

	return 0;
}

string solve_puzzle(string S,vector<int> c)
{
	a = c;
	s = "_"+S+"_";
	n = S.length();
	Main();
	return ans;
}

#ifdef death

int main()
{
	int K;
	string S;
	vector<int> C;
	cin >> S >> K;
	while (K--)
	{
		C.PB(0);
		cin >> C.back();
	}
	cout << solve_puzzle(S, C) << endl;
	return 0;
}

#endif

/*

.X........
1
3

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...