CSES - HIIT Open 2019 - Results
Submission details
Task:Insert Whitespace
Sender:Game of Nolife
Submission time:2019-05-25 13:36:21 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.02 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.03 sdetails
#4ACCEPTED0.02 sdetails
#5ACCEPTED0.03 sdetails
#6ACCEPTED0.02 sdetails
#7ACCEPTED0.03 sdetails
#8ACCEPTED0.11 sdetails
#9ACCEPTED0.11 sdetails
#10ACCEPTED0.09 sdetails
#11ACCEPTED0.04 sdetails
#12ACCEPTED0.03 sdetails
#13ACCEPTED0.02 sdetails

Code

#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long long ll;
typedef long double ld;

pair<int, int> dp[5005][52][82];

int n,h,w,p;
int tw=0;

string www[5005];
int par[5005];

string spas(int x){
    string r;
    for (int i=0;i<x;i++){
        r+=' ';
    }
    return r;
}

pair<pair<int, int>, string> ns(int i, int l, int ch, int sp){
    if (i==tw-1){ // kaikki loppu
        if (l==0) return {{-1, -1}, ""};
        if (ch+(int)www[i].size()<=w){
            return {{l, ch+(int)www[i].size()}, www[i]};
        } else {
            return {{-1, -1}, ""};
        }
    } else if (par[i] != par[i+1]) { // paragraph loppu
        if (l==0) return {{-1, -1}, ""};
        if (l==h-2) return {{-1, -1}, ""};
        if (ch+(int)www[i].size()<=w){
            if (l==h-1){
                return {{0, p}, www[i]+"\n#\n"+spas(p)};
            } else{
                return {{l+1, p}, www[i]+"\n"+spas(p)};
            }
        }
    } else if (ch+(int)www[i].size()==w){ // rivi loppu
        if (l==h-1){
            return {{0, 0}, www[i]+"\n#\n"};
        } else {
            return {{l+1, 0}, www[i]+"\n"};
        }
    } else if (ch+sp+(int)www[i].size()<w) { // rivi ei lopu
        return {{l, ch+sp+(int)www[i].size()}, www[i]+spas(sp)};
    } else {
        return {{-1, -1}, ""};
    }
    return {{-1, -1}, ""};
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>h>>w>>p;
    string temp;
    getline(cin, temp);
    for (int i=0;i<n;i++){
        getline(cin, temp);
        stringstream ss;
        ss<<temp;
        while (ss>>temp){
            par[tw]=i;
            www[tw++]=temp;
        }
    }
    for (int i=0;i<=tw;i++){
        for (int j=0;j<=h;j++){
            for (int k=0;k<=w;k++){
                dp[i][j][k]={-1, -1};
            }
        }
    }
    const pair<int, int> fail={-1, -1};
    dp[0][0][p]={0, 0};
    for (int i=0;i<tw;i++){
        for (int j=0;j<h;j++){
            for (int x=0;x<=w;x++){
                if (dp[i][j][x]==fail) continue;
                for (int a=1;a<=2;a++){
                    auto ne=ns(i, j, x, a);
                    if (ne.F==fail) continue;
                    dp[i+1][ne.F.F][ne.F.S]={j, x};
                }
            }
        }
    }
    pair<int, int> rec=fail;
    for (int j=0;j<h;j++){
        for (int x=0;x<=w;x++){
            if (dp[tw][j][x]!=fail) {
                rec={j, x};
            }
        }
    }
    if (rec==fail){
        cout<<"IMPOSSIBLE";
        return 0;
    }
    vector<string> ans;
    for (int i=tw;i>0;i--){
        auto from=dp[i][rec.F][rec.S];
        int f=0;
        for (int a=1;a<=2;a++){
            auto lol=ns(i-1, from.F, from.S, a);
            if (lol.F==rec){
                ans.push_back(lol.S);
                rec=from;
                f=1;
                break;
            }
        }
        assert(f);
    }
    cout<<spas(p);
    for (int i=(int)ans.size()-1;i>=0;i--){
        cout<<ans[i];
    }
}

Test details

Test 1

Verdict: ACCEPTED

input
3 5 10 2
a a a a a a a a a a a a a a a ...

correct output
  a  a a a
a  a a a a
a  a a a a
a  a a a a
a
...

user output
  a  a a a
a  a  a  a
a  a  a  a
a  a  a  a
a  a  a  a
...

Test 2

Verdict: ACCEPTED

input
3 6 10 2
a a a a a a a a a a a a a a a ...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 3

Verdict: ACCEPTED

input
3 7 10 2
a a a a a a a a a a a a a a a ...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 4

Verdict: ACCEPTED

input
3 8 10 2
a a a a a a a a a a a a a a a ...

correct output
  a  a a a
a  a a a a
a  a a a a
a  a a a a
a
...

user output
  a  a a a
a  a  a  a
a  a  a  a
a  a  a  a
a  a  a  a
...

Test 5

Verdict: ACCEPTED

input
5 10 80 4
Lorem ipsum dolor sit amet, co...

correct output
    Lorem ipsum dolor sit amet...

user output
    Lorem ipsum dolor sit amet...

Test 6

Verdict: ACCEPTED

input
5 10 70 4
Lorem ipsum dolor sit amet, co...

correct output
    Lorem ipsum dolor sit amet...

user output
    Lorem  ipsum  dolor  sit  ...

Test 7

Verdict: ACCEPTED

input
5 10 60 4
Lorem ipsum dolor sit amet, co...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 8

Verdict: ACCEPTED

input
55 20 80 4
Lorem ipsum dolor sit amet, co...

correct output
    Lorem  ipsum dolor sit ame...

user output
    Lorem  ipsum  dolor  sit  ...

Test 9

Verdict: ACCEPTED

input
55 20 80 6
Lorem ipsum dolor sit amet, co...

correct output
      Lorem  ipsum  dolor  sit...

user output
      Lorem  ipsum  dolor  sit...

Test 10

Verdict: ACCEPTED

input
55 20 80 8
Lorem ipsum dolor sit amet, co...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 11

Verdict: ACCEPTED

input
3 43 37 34
aaa aaaaa aaaa a aa aa aa aaa ...

correct output
                              ...

user output
                              ...

Test 12

Verdict: ACCEPTED

input
4 50 73 12
aaaaa aa a aaa a aaa aaaa aaaa...

correct output
            aaaaa  aa  a  aaa ...

user output
            aaaaa  aa  a  aaa ...

Test 13

Verdict: ACCEPTED

input
4 6 62 31
aa aaa aaa aa aaaaa aaa aaaaa ...

correct output
                              ...

user output
                              ...