제출 #73133

#제출 시각아이디문제언어결과실행 시간메모리
73133XmtosXPaint By Numbers (IOI16_paint)C++17
100 / 100
1628 ms510408 KiB
#include <bits/stdc++.h>
#include "paint.h"
using namespace std;
const int N=4e5+5;

int n,k;
short memo[N][502];
bool can[N][502];
string s1;
vector <int> v;
bool dp (int pos,int cur)
{
    if (pos>=n)
        return (cur==k);
    short &ret= (memo[pos][cur]);
    if (ret!=-1)
        return (ret!=0);
    ret=0;
    if (s1[pos]=='_'||s1[pos]=='.')
        ret= dp(pos+1,cur);
    if (cur!=k&&can[pos][cur])
    {
        if (s1[pos]=='X'||s1[pos]=='.')
            ret+= (dp(pos+v[cur]+1,cur+1))*2;
    }
    return (ret!=0);
}
string solve_puzzle( string s,  vector<int> c)
{
    n=s.size();
    k=c.size();
    s1=s;
    memset(memo,-1,sizeof memo);
    v=c;
    for (int i=k-1;i>=0;i--)
    {
        int cnt=0;
        for (int j=n-1;j>=0;j--)
        {
            cnt+= (s[j]=='_');
            if (j+v[i]<n)
                cnt-= (s[j+v[i]]=='_');
            if (j+v[i]<=n)
                can[j][i]= (cnt==0);
            if (j+v[i]<n&&s[j+v[i]]=='X')
                can[j][i]=0;
        }
    }
    dp(0,0);
    string ans;
    int pfx[N];
    memset(pfx,0,sizeof pfx);
    for (int i=0;i<n;i++)
        for (int j=0;j<=k;j++)
            if (memo[i][j]==-1)
                memo[i][j]=0;
    for (int i=n-1;i>=0;i--)
    {
        for (int j=0;j<k;j++)
        {
            if (memo[i][j]==-1)
                continue;
            pfx[i+1]+= (memo[i][j]&2);
            pfx[i+v[j]]-= (memo[i][j]&2);
            memo[i+v[j]][j]|= (memo[i][j]&2)!=0;
        }
    }
    for (int i=1;i<n;i++)
        pfx[i]+=pfx[i-1];
    for (int i=0;i<n;i++)
    {
        if (pfx[i])
            memo[i][0]|=2;
    }
    for (int i=0;i<n;i++)
    {
        int a=0;
        for (int j=0;j<=k;j++)
        {
            if (memo[i][j]!=-1)
            {
                a|=memo[i][j];
            }
        }
        if (a==1)
            ans+='_';
        else if (a==2)
            ans+='X';
        else
            ans+='?';
    }
    return ans;
}
/*
const int S_MAX_LEN = 200 * 1000;
char buf[S_MAX_LEN + 1];
int main() {
    assert(1 == scanf("%s", buf));
    std::string s = buf;
    int c_len;
    assert(1 == scanf("%d", &c_len));
    std::vector<int> c(c_len);
    for (int i = 0; i < c_len; i++) {
        assert(1 == scanf("%d", &c[i]));
    }
    std::string ans = solve_puzzle(s, c);


    printf("%s\n", ans.data());
    return 0;
}

*/
#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...