Submission #953540

#TimeUsernameProblemLanguageResultExecution timeMemory
953540DarkKnight101Type Printer (IOI08_printer)C++17
100 / 100
100 ms93132 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
 
#define endl "\n"
#define aint(v) v.begin(),v.end()
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define forl(i,n) for(int i=0;i<n;i++)

const ll WMAX = 5e5+5;
const ll MOD = 1e9 + 7;

ll trie[WMAX][26];
ll node_count;
bool stop[WMAX];

/** Adds a new word into the trie. */
void insert_word(string& word) {
	// Node 0 has 26 children - a through z.
	ll node = 0;
	for (char c : word) {
		// If a node with the current char doesn't exist create one.
		if (trie[node][c - 'a'] == 0) { trie[node][c - 'a'] = ++node_count; }
		// Move down the path in the trie.
		node = trie[node][c - 'a'];
	}
	// Mark the ending node so we know it's a dictionary word
	stop[node] = true;
}

vector<char>ans;
string big;
ll mx =0;

void fun(ll node,ll depth){
    ll curr = big[depth]-'a';
    curr++;
    if(depth>=mx) return;
    forl(i,26){
        if(trie[node][(i+curr)%26]){
            ans.pb(97+((i+curr)%26));
            
        
            if(stop[trie[node][(i+curr)%26]]) {
                ans.pb('P');
            }
            
            fun(trie[node][(i+curr)%26],depth+1);
            ans.pb(45);
        }
    }
}



void solve(){
    ll n;
    cin >> n;
    string s;
    mx=0;
    
    forl(i,n){
        cin >> s;
        if(s.length()>mx){
            big = s;
            mx= s.length();
        }
        insert_word(s);
    }
    fun(0,0);
    while(ans.back()==45) ans.pop_back();
    cout << ans.size() << endl;
    for(auto i:ans) cout << i << endl;


}



int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int tt=1;
    // cin >> tt;
    while (tt--){
        solve();
    }
}

Compilation message (stderr)

printer.cpp: In function 'void solve()':
printer.cpp:68:22: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   68 |         if(s.length()>mx){
      |            ~~~~~~~~~~^~~
#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...