150022025-02-11 06:06:56lelodKígyózó szavakcpp17Time limit exceeded 30/100300ms564 KiB
#include <iostream>
#include <fstream>
#include<algorithm>

using namespace std;

class Backa {
public:
    int v[10001];     // data member
    int n;     // data member
    int m = 0;     // data member
    int m_to_keep = 0;     // data member
    int k;
    int isS, isV;
    int *Ks;
    int *sortKs;
    int *trans;
    int *trans2;
    int H, N;
    ofstream outfile;

    void Init(int k) { // k – vârful stivei
        v[k] = 0; //iniţializează/resetează, valoarea din
// vârful stivei
    }

    int Succesor(int k) {
        if (v[k] < 26) { // se poate creşte valoarea din vârf
            v[k]++;
// se incrementează valoarea din vârf
            return 1; // funcţia a avut success
        } else
// nu se poate creşte valoarea din vârf
            return 0;
    }

    int Valid(int k) {
//        for (int i = 1; i < k; i++) // verifică dacă elementul din
// vârf este diferit de
// elemente precedente din stivă
//            if (v[i] == v[k]) return 0;
//        return 1;
        if (k == 1)
            return 1;
        if (v[k] == v[k - 1] + 1) return 1;
        if (v[k] == v[k - 1] - 1) return 1;
        return 0;

    }

    int Solution(int k) {
        m++;
//        return (k == n); // length n
        bool res;
        res = binary_search(sortKs, sortKs + N, m);
//        res = true;
        return (k <= n && res && ++m_to_keep);
    }


    string Print() {
        string ret;
        ret = "";
        for (int i = 1; i <= k; i++)
            ret = ret + (char) (v[i] + 97 - 1);
//        cout<< ret;
        return ret;
//        return ; // only at end
//        printf("%d : ", ++m);
//        for (int i = 1; i <= n; i++) // bad n,instead k
        for (int i = 1; i <= k; i++)
//            printf("%d ", v[i]);
            printf("%c", v[i] + 97 - 1);
        cout << endl;
    }

    Backa(char fileName[]) {
        istream* in;
        ifstream infile;

        if(fileName == "cin")
        {
            in = &cin;
        }
        else
        {
            infile.open(fileName);
            in = &infile;
        }

        outfile.open(".\\..\\\\minta\\ki.txt");
        cin >> H;
        cin >> N;
        cin.get();
//        infile >> H;
//        infile >> N;
//        cerr << H << ' ';
//        cerr << N << endl;
//        int *Ks;
//        Ks = (int*)malloc(sizeof(int) * 20);
        int Ks[N];
        int sortKs[N];
        int trans[N];
        string Sols[N];
        for (int i = 0; i < N; ++i) {
//            infile >> Ks[i];
            cin >> Ks[i];
//        cerr << Ks[i] << " ";
        }
        copy(Ks, Ks + N, sortKs);
        sort(sortKs, sortKs + N);
        int aa, bb;
        for (int i = 0; i < N; ++i) {
//            trans[i] = distance(sortKs, find(sortKs, sortKs + N, Ks[i]));
            trans[distance(sortKs, find(sortKs, sortKs + N, Ks[i]))] = i;
        }
//        Sols[0] = "aasa";
//        a    1 3 13 8
//             1 2 4  3
//        Sols 1 2 3  4
//    cerr << endl;

        this->Ks = Ks;
        this->sortKs = sortKs;
        this->trans = trans;
        this->n = H;
//        cerr << n << endl;
        k = 1;
        Init(k);
        while (k > 0) { // cât timp stiva nu e vidă
            isS = 0;
            isV = 0;
            if (k <= n) // nu face sens depăşirea nivelului n în stivă
                do {
// repetă cât timp...
                    isS = Succesor(k);
                    if (isS) isV = Valid(k);
                } while (isS && !isV); // ...există succesor dar nu este valid
            if (isS) {//este succesor si este valid
                if (Solution(k)) {

                    Sols[trans[m_to_keep - 1]] = Print();
//                    Print();
                } // verifică candidatul la soluţie
// afişează soluţia
//                else { // dacă nu este soluţie
                k++;
                Init(k); // creşte vârful stivei şi iniţializează
//                }
            } else // nu există succesor pt. valoarea curentă din stivă
                k--; // -> se coboară o poziţie în stivă
        }
        for (int i = 0; i < N; ++i) {
            cout << Sols[i] << endl;
//            outfile<< Sols[i] << endl;

        }
        outfile.close();
    }
};


int main() {
//    cerr << "Begin:" << endl;
    clock_t start = clock();
//    Backa backa(".\\..\\\\minta\\be2.txt");
    Backa backa("cin");
    clock_t stop = clock();
    double elapsed = (double) (stop - start) / CLOCKS_PER_SEC;
    fprintf(stderr, "\nTime elapsed: %.5f\n", elapsed);
    //    cerr << "End." << endl;
    return 0;
}
SubtaskSumTestVerdictTimeMemory
base30/100
1Accepted0/01ms500 KiB
2Accepted0/02ms316 KiB
3Accepted5/51ms316 KiB
4Accepted5/51ms316 KiB
5Accepted5/52ms316 KiB
6Accepted5/53ms316 KiB
7Accepted5/54ms316 KiB
8Accepted5/54ms500 KiB
9Time limit exceeded0/5300ms508 KiB
10Time limit exceeded0/5300ms564 KiB
11Time limit exceeded0/5300ms464 KiB
12Time limit exceeded0/5300ms508 KiB
13Time limit exceeded0/5284ms544 KiB
14Time limit exceeded0/6286ms316 KiB
15Time limit exceeded0/6286ms508 KiB
16Time limit exceeded0/6287ms316 KiB
17Time limit exceeded0/6284ms468 KiB
18Time limit exceeded0/7286ms508 KiB
19Time limit exceeded0/7287ms564 KiB
20Time limit exceeded0/7287ms316 KiB