Submission #1195322


Source Code Expand

#include <iostream>
#include <bitset>
#include <vector>
#include <cmath>
#include <ctime>
#include <cassert>
#include <cstdio>
#include <queue>
#include <set>
#include <map>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <numeric>

#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)

using namespace std;

typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef long long i64;
typedef vector<i64> vi64;
typedef vector<vi64> vvi64;

template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }

const int maxn = 201;
i64 LIM = 1e13;
i64 dp[maxn][maxn];

i64 common_sub(vi s, vi t) {
    int n = s.size(), m = t.size();
    forn(i, n + 1) forn(j, m + 1) dp[i][j] = 0;
    dp[0][0] = 1;
    forn(i, n + 1) forn(j, m + 1) {
        if (i) dp[i][j] += dp[i - 1][j];
        if (j) dp[i][j] += dp[i][j - 1];
        if (i && j && s[i - 1] != t[j - 1]) dp[i][j] -= dp[i - 1][j - 1];
        if (dp[i][j] >= LIM) return LIM;
    }
    return dp[n][m];
}

int main() {
    i64 n;
    cin >> n;
/*    if (n == 1) {
        cout << "1\n1\n";
        return 0;
    }*/
    vi a;
    i64 ans = 0;
    int x = 1;
    while (ans < n) {
        int bi = -1;
        i64 bx = -1e9;
        forn(i, a.size() + 1) {
            i64 res = common_sub(vi(a.begin(), a.begin() + i), vi(a.begin() + i, a.end()));
            if (ans + res <= n && res > bx) bx = res, bi = i;
//            cerr << i << ' ' << res << '\n';
        }

        vi b;
        forn(i, a.size() + 1) {
            if (!i) b.pb(x);
            if (i == bi) b.pb(x);
            if (i < a.size()) b.pb(a[i]);
        }
        a = b;
        ans += bx;
        ++x;
    }
    cout << a.size() << '\n';
    forn(i, a.size()) cout << a[i] << " \n"[i + 1 == a.size()];
}

Submission Info

Submission Time
Task C - Tautonym Puzzle
User endagorion
Language C++14 (GCC 5.4.1)
Score 1000
Code Size 2380 Byte
Status AC
Exec Time 37 ms
Memory 512 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 2
AC × 32
Set Name Test Cases
Sample 00_example_01.txt, 00_example_02.txt
All 00_example_01.txt, 00_example_02.txt, 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt
Case Name Status Exec Time Memory
00_example_01.txt AC 1 ms 256 KB
00_example_02.txt AC 1 ms 256 KB
01.txt AC 12 ms 384 KB
02.txt AC 1 ms 256 KB
03.txt AC 1 ms 256 KB
04.txt AC 7 ms 384 KB
05.txt AC 1 ms 256 KB
06.txt AC 1 ms 256 KB
07.txt AC 7 ms 384 KB
08.txt AC 10 ms 384 KB
09.txt AC 1 ms 256 KB
10.txt AC 2 ms 256 KB
11.txt AC 3 ms 384 KB
12.txt AC 1 ms 256 KB
13.txt AC 5 ms 384 KB
14.txt AC 2 ms 256 KB
15.txt AC 4 ms 384 KB
16.txt AC 1 ms 256 KB
17.txt AC 1 ms 256 KB
18.txt AC 2 ms 384 KB
19.txt AC 6 ms 384 KB
20.txt AC 2 ms 384 KB
21.txt AC 6 ms 384 KB
22.txt AC 1 ms 256 KB
23.txt AC 10 ms 384 KB
24.txt AC 3 ms 384 KB
25.txt AC 1 ms 256 KB
26.txt AC 12 ms 384 KB
27.txt AC 37 ms 512 KB
28.txt AC 1 ms 256 KB
29.txt AC 19 ms 384 KB
30.txt AC 14 ms 384 KB