Submission #395288

# Submission time Handle Problem Language Result Execution time Memory
395288 2021-04-28T06:00:33 Z Andyvanh1 Type Printer (IOI08_printer) C++14
100 / 100
156 ms 31956 KB
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <map>
#include <math.h>

using namespace std;

#define pb push_back
#define INF INT32_MAX
#define vt vector


typedef vt<int> vi;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tiii;
typedef long long ll;


int n;


#define MOD  1000000007
vt<vi> adjlist(1);
vt<char> node(1);
vt<int> endd(1);
vt<int> par(1);
vt<int> depth(1);
vt<bool> mark;
int id;
int cur = 0;

void build(string str){
    int cur = 0;
    int at = 0;

    while(at!=str.length()){

        bool bol = false;
        for(auto& e: adjlist[cur]){
            if(e==par[cur])continue;
            if(node[e]==str[at]){
                at++;
                    cur = e;

                bol = true;
                break;
            }
        }
        if(!bol)break;

    }
    if(at==str.length()){
        endd[cur]++;
        return;
    }
    at--;
    while(at!=str.length()-1){
        adjlist.pb(vi(0));
        adjlist[cur].pb(id);
        adjlist[id].pb(cur);
        depth.pb(at+1);
        par.pb(cur);
        node.pb(str[at+1]);
        endd.pb(0);
        cur = id;
        at++;id++;

    }
    endd[id-1]++;
}
vt<bool> visited;
void dfs(int noder){
    cur++;
    visited[noder] = true;
    if(endd[noder]){
        for(int i = 0; i < endd[noder]; i++)
        cout<<"P"<<'\n';
    }
    int scrib = -1;
for(auto& e: adjlist[noder]){
    if(mark[e]&&!visited[e]){
        scrib = e;
        continue;
    }
    if(!visited[e]){
        cout<<string(1,node[e])<<'\n';
        dfs(e);
    }

}
if(scrib!=-1){
    cout<<string(1,node[scrib])<<'\n';
    dfs(scrib);
}
if(cur!=adjlist.size()) {
    cout << "-" << '\n';
}
}

void specbuild(string str){
    mark.resize(adjlist.size());
    for(int i = 0; i < adjlist.size(); i++){
        mark[i] = false;
    }
    int cur = 0;
    int at = 0;

    while(at!=str.length()){

        bool bol = false;
        for(auto& e: adjlist[cur]){
            if(e==par[cur])continue;
            if(node[e]==str[at]){
                at++;
                cur = e;
                mark[cur] = true;

                bol = true;
                break;
            }
        }
        if(!bol)break;

    }
}

void solve2(){
    node[0] = 'A';
    endd[0] = 0;
    par[0] = -1;
    depth[0] = -1;
    string Maxstr;

    cin>>n;
    id = 1;
    int Max = 0;
    for(int i = 0; i < n; i++){
        string s;
        cin>>s;
        int x = s.length();
        if(x>Max){
            Max = x;
            Maxstr = s;
        }
        build(s);
    }
    specbuild(Maxstr);
    



    visited.resize(adjlist.size());
    for(int i = 0; i < adjlist.size(); i++){
        visited[i] = false;
    }
    cout<<2*adjlist.size()+n-Max-2<<'\n';
    dfs(0);





}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int tc = 1;
    //cin>>tc;

    solve2();




    return 0;
}

Compilation message

printer.cpp: In function 'void build(std::string)':
printer.cpp:40:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |     while(at!=str.length()){
      |           ~~^~~~~~~~~~~~~~
printer.cpp:56:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |     if(at==str.length()){
      |        ~~^~~~~~~~~~~~~~
printer.cpp:61:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |     while(at!=str.length()-1){
      |           ~~^~~~~~~~~~~~~~~~
printer.cpp: In function 'void dfs(int)':
printer.cpp:99:7: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 | if(cur!=adjlist.size()) {
      |    ~~~^~~~~~~~~~~~~~~~
printer.cpp: In function 'void specbuild(std::string)':
printer.cpp:106:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |     for(int i = 0; i < adjlist.size(); i++){
      |                    ~~^~~~~~~~~~~~~~~~
printer.cpp:112:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |     while(at!=str.length()){
      |           ~~^~~~~~~~~~~~~~
printer.cpp: In function 'void solve2()':
printer.cpp:157:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |     for(int i = 0; i < adjlist.size(); i++){
      |                    ~~^~~~~~~~~~~~~~~~
printer.cpp: In function 'int main()':
printer.cpp:174:9: warning: unused variable 'tc' [-Wunused-variable]
  174 |     int tc = 1;
      |         ^~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 716 KB Output is correct
2 Correct 4 ms 1100 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 2132 KB Output is correct
2 Correct 20 ms 4280 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 28 ms 4828 KB Output is correct
2 Correct 9 ms 1288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 63 ms 12404 KB Output is correct
2 Correct 131 ms 27000 KB Output is correct
3 Correct 84 ms 14056 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 53 ms 9332 KB Output is correct
2 Correct 156 ms 31956 KB Output is correct
3 Correct 84 ms 15860 KB Output is correct
4 Correct 153 ms 30128 KB Output is correct