Advertisement
erek1e

IOI '08 P1 - Type Printer

Jul 14th, 2023
1,009
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. size_t commonPrefix(const string &s1, const string &s2) {
  9.     size_t i = 0;
  10.     while (i < s1.size() && i < s2.size() && s1[i] == s2[i]) ++i;
  11.     return i;
  12. }
  13.  
  14. int main() {
  15.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  16.     int n; cin >> n;
  17.     vector<string> v(1+n);
  18.     int longest = 0;
  19.     for (int i = 1; i <= n; ++i) {
  20.         cin >> v[i];
  21.         if (v[i].size() > v[longest].size()) longest = i;
  22.     }
  23.    
  24.     string maxString = v[longest];
  25.     auto stringLess = [&](const string &s1, const string &s2) {
  26.         for (size_t i = 0; i < s1.size() && i < s2.size(); ++i) {
  27.             if (s1[i] != s2[i]) {
  28.                 if (s1[i] == maxString[i]) return false;
  29.                 if (s2[i] == maxString[i]) return true;
  30.                 return s1[i] < s2[i];
  31.             }
  32.         }
  33.         return s1.size() < s2.size();
  34.     };
  35.     sort(v.begin()+1, v.end(), stringLess);
  36.  
  37.     string operations;
  38.     for (int i = 1; i <= n; ++i) {
  39.         size_t overlap = commonPrefix(v[i-1], v[i]);
  40.         operations += string(v[i-1].size() - overlap, '-') + v[i].substr(overlap);
  41.         operations.push_back('P');
  42.     }
  43.     cout << operations.size() << '\n';
  44.     for (char c : operations) cout << c << '\n';
  45.     return 0;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement