Submission #1184641

#TimeUsernameProblemLanguageResultExecution timeMemory
1184641amm_ouxType Printer (IOI08_printer)C++20
100 / 100
129 ms105852 KiB
#include <bits/stdc++.h>

using namespace std ;
#ifdef LOCAL
#include "/Library/debug/debug.h"
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif

#define MAX                 2e9
#define MIN                 -2e9
#define PI                  acos(-1.0)
#define mid(s, e)           ((s) + ((e) - (s)) / 2)
#define clz(n)              __builtin_clzll(n)
#define nbOfBits(n)         __builtin_popcountll(n)
#define all(x)              (x).begin(), (x).end()
#define endl                '\n'
#define pb                  push_back
#define sz(a)               static_cast<int>((a).size())
#define double              long double
#define fi                  first
#define fill(n,arr) = for(int i=1;i<=n;i++){ll x;cin>>x;arr.pb(x);}
#define se                  second
#define getunique(v)        {sort(all(v)); v.erase(unique(all(v)), v.end());}
#define getlower(s)         transform(s.begin(), s.end(), s.begin(), ::tolower)
#define getupper(s)         transform(s.begin(), s.end(), s.begin(), ::toupper)
#define sort(s)             sort(s.begin(), s.end())
#define reverse(s)          reverse(s.begin(), s.end())
#define getmax(ans)         *(all(ans));
#define getmin(ans)         *min_element(all(ans));

using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using vc = vector<char>;
using vvc = vector<vc>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vd = vector<double>;
using vvd = vector<vd>;
using vs = vector<string>;
using pii = pair<int, int>;
using pdd = pair<double, double>;
using vpii = vector<pii>;
using vpdd = vector<pdd>;
using si = set<int>;
using ssi = set<si>;
/*
struct trie {

    char ch ;
    bool flag = false ;
    trie* nexts[26] ;
};



trie* CreateNode (char letter){
trie * node = new trie ;
node->ch = letter ;
for (ll i = 0 ; i<26 ; i++ ) node->nexts[i] = NULL ;
return node ;
}

trie* root = CreateNode('0') ;

void InsertWord (string word){

    trie *Node = root ;

    for (ll i = 0 ; i<word.size() ; i++){
            if (Node->nexts[word[i]-'a'] == NULL){Node->nexts[word[i]-'a']=CreateNode(word[i]) ; }
            Node = Node->nexts[word[i]-'a'] ;
    }
    Node->flag = true ;
}

bool searchWord (string word){

    trie *Node = root ;

    for (ll i = 0 ; i<word.size() ; i++){
            if (Node->nexts[word[i]-'a'] == NULL) return 0 ;
            else
            Node = Node->nexts[word[i]-'a'] ;
    }
    if (Node->flag) return 1 ;
    else return 0 ;
}

void display (trie * ROOT , string saved){
    trie *node ;
    string s = saved ;

    for (ll i = 0 ; i < 26 ; i++){
        if (ROOT->nexts[i] != NULL) {node = ROOT->nexts[i] ; s +=node->ch ; if (node->flag) cout << s << endl ; display (node , s ) ; s = saved ;}
    }
}



void SOlve(){
    cout << "How many words to insert ? " << endl ;
    ll n ; cin >> n ; string word ;
    for (ll i = 0 ; i < n ; i++){
        cin >> word ;
         InsertWord (word) ;
    }

    display(root , "") ;

    cout << "how many words are u looking for ? " << endl ;
    cin >> n ;
    for (ll i = 0 ; i < n ; i++){
        cin >> word ;
         if (searchWord (word)) cout << " YES .. It is there !! " << endl ;
         else cout << " NO .. It isn't there !! " << endl ;

    }
   }

*/

string ans = "" ;
bool prefs [20] ;

struct trie {
    char l ;
    trie * child [26] ;
    ll wordend = 0 ;
};

trie* createNode (char ch){
    trie * node = new trie ;
    node->l = ch ;
    for (ll i = 0 ; i< 26 ; i++){
        node->child[i] = NULL ;
    }
    return node ;
}

trie * root = createNode ('0') ;

void insertWord (string word){
    trie * node = root ;
    for (ll i = 0 ; i < word.size() ; i++){
        if (node->child [word[i]-'a'] == NULL){node->child [word[i]-'a'] = createNode(word[i]) ; }
         node = node->child [word[i]-'a'] ;
    }
    node->wordend ++ ;
}


void carefulDfsOnTrie (trie * prevnode , char watchout ){
    trie* node ;
    for (ll i = 0 ; i < 26 ; i++){
            node = prevnode->child[i] ;
            if (i == watchout - 'a' ) continue ;
            if (node == NULL) continue ;
            else {
                ans += node->l ;
               for (ll k = 0 ; k < node->wordend ; k++ ) ans += 'P' ;
                carefulDfsOnTrie(node , '1' ) ;
                ans += '-' ;
            }
    }

}


void scanprefs ( string watchout  ){
    for (ll i = 0 ; i < 20 ; i++) prefs[i] = 0 ;
    trie* node = root ;

    for (ll i = 0 ; i < watchout.size() ; i++){
            node = node->child[watchout[i]-'a'] ;
            if (node->wordend) prefs[i] = 1 ;

            }
    }



void solve (){
    ll n ; cin >> n ;
    string s ; ll maxl = 0 ; string deepestw ;

    for ( ll i = 0 ; i < n ; i++){
        cin >> s ;
        if (s.size() > maxl) {maxl = s.size() ; deepestw = s ;}
        insertWord(s);
    }

    trie * nd = root ;

    scanprefs (deepestw) ;

    for ( ll j = 0 ; j < maxl ; j++){
        carefulDfsOnTrie(nd , deepestw[j] ) ;
        ans += deepestw[j] ;
        if (prefs[j]) ans +='P' ;
        nd = nd->child [deepestw[j]-'a'] ;
    }


    cout << ans .size()<< endl;

    for (ll i = 0 ; i < ans .size() ; i++ ){
        cout << ans [i] << endl ;
    }


}

signed main() {
    //ios::sync_with_stdio(false); cin.tie(0);
    ll t;t= 1 ;
    while(t--)
    solve();
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...