Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. vector<pair<string, char>> tags(1);
  8. string s;
  9. int open, close, slash;
  10.  
  11. void correctLetters() {
  12.     int j;
  13.     for (int i = 0; i < tags.size(); i++) {
  14.         if (!tags[i].second) {
  15.             j = i + 1;
  16.             int h = i;
  17.             while (h != j) {
  18.                 h++;
  19.                 if (!tags[h].second) {
  20.                     j += 2;
  21.                 }
  22.             }
  23.             if (tags[j].first.find("$") == -1) {
  24.                 tags[i].first = tags[j].first;
  25.             }
  26.             else {
  27.                 tags[j].first = tags[i].first;
  28.             }  
  29.         }
  30.     }
  31.     for (int i = 0; i < tags.size(); i++) {
  32.         if (tags[i].second) {
  33.             cout << tags[i].first[0] << "/"
  34.                 << tags[i].first.substr(1, tags[i].first.size() - 1);
  35.         }
  36.         else {
  37.             cout << tags[i].first;
  38.         }
  39.     }
  40.     return;
  41. }
  42.  
  43. void cutString() {
  44.     open = 0;
  45.     close = 0;
  46.     slash = 0;
  47.     tags.resize(1);
  48.     for (int i = 0; i < s.size(); i++) {
  49.         if (s[i] != '/') {
  50.             tags[close].first.push_back(s[i]);
  51.         }
  52.         if (s[i] == '>') {
  53.             close++;
  54.             tags.resize(close + 1);
  55.         }
  56.         if (s[i] == '<') {
  57.             open++;
  58.         }
  59.         if (s[i] == '/') {
  60.             slash++;
  61.             if ((tags[close].second == true) && (tags[close].first[0] == '<')) {
  62.                 tags[close].first.push_back('$');
  63.                 slash--;
  64.             }
  65.             tags[close].second = true;
  66.         }
  67.     }
  68.     tags.pop_back();
  69. }
  70.  
  71. void correctSlashes() {
  72.     if (slash > open / 2) {
  73.         vector<char> checked(tags.size());
  74.         int j;
  75.         for (int i = 0; i < tags.size(); i++) {
  76.             if (!tags[i].second) {
  77.                 j = i + 1;
  78.                 int h = i;
  79.                 while (j != h) {
  80.                     h++;
  81.                     if (!tags[h].second) {
  82.                         j += 2;
  83.                     }
  84.                 }
  85.                 if (tags[i].first == tags[j].first) {
  86.                     checked[j] = true;
  87.                 }
  88.             }
  89.         }
  90.         int first = -1, second;
  91.         for (int i = 0; i < tags.size(); i++) {
  92.             if ((!checked[i]) && (tags[i].second)) {
  93.                 if (first != -1) {
  94.                     second = i;
  95.                     break;
  96.                 }
  97.                 else {
  98.                     first = i;
  99.                 }
  100.             }
  101.         }
  102.         tags[first].first = tags[second].first;
  103.         tags[first].second = false;
  104.     }
  105.     else {
  106.         //
  107.         vector<char> checked(tags.size());
  108.         int j;
  109.         for (int i = tags.size() - 1; i >= 0; i--) {
  110.             if (tags[i].second) {
  111.                 j = i - 1;
  112.                 int h = i;
  113.                 while (j != h) {
  114.                     h--;
  115.                     if (tags[h].second) {
  116.                         j -= 2;
  117.                     }
  118.                 }
  119.                 if (tags[i].first == tags[j].first) {
  120.                     checked[j] = true;
  121.                     checked[i] = true;
  122.                 }
  123.             }
  124.         }
  125.         int first, second = -1;
  126.         for (int i = tags.size() - 1; i >= 0; i--) {
  127.             if ((!checked[i]) && (!tags[i].second)) {
  128.                 if (second != -1) {
  129.                     first = i;
  130.                     break;
  131.                 }
  132.                 else {
  133.                     second = i;
  134.                 }
  135.             }
  136.         }
  137.         tags[second].first = tags[first].first;
  138.         tags[second].second = true;
  139.  
  140.     }
  141.     for (int i = 0; i < tags.size(); i++) {
  142.         if (tags[i].second) {
  143.             cout << tags[i].first[0] << "/"
  144.                 << tags[i].first.substr(1, tags[i].first.size() - 1);
  145.         }
  146.         else {
  147.             cout << tags[i].first;
  148.         }
  149.     }
  150.     return;
  151. }
  152.  
  153. void correctMissingBreckets() {
  154.     //if (open < slash * 2) {
  155.         for (int i = 0; i < s.size() - 1; i++) {
  156.             if (s[i] == '>') {
  157.                 s[i + 1] = '<';
  158.             }
  159.         }
  160.     //}
  161.     //if (open < slash * 2) {
  162.         for (int i = 1; i < s.size(); i++) {
  163.             if (s[i] == '<') {
  164.                 s[i - 1] = '>';
  165.             }
  166.         }
  167.     //}
  168.     s[s.size() - 1] = '>';
  169.     s[0] = '<';
  170.     cout << s;
  171.     return;
  172.  
  173. }
  174.  
  175. void checkAll() {
  176.     if (open == close) {
  177.         if (slash == open / 2) {
  178.             correctLetters();
  179.             return ;
  180.         }
  181.         else {
  182.             correctSlashes();
  183.             return ;
  184.         }
  185.     }
  186.     else {
  187.         if (open + close < slash * 4) {
  188.             correctMissingBreckets();
  189.             return ;
  190.         }
  191.         else if (open + close == slash * 4) {
  192.             for (int i = 1; i < s.size() - 1; i++) {
  193.                 if (s[i] == '>') {
  194.                     s[i + 1] = '<';
  195.                 }
  196.                 if ((s[i] == '<') && (s[i - 1] != '>')) {
  197.                     s[i] = '>';
  198.                 }
  199.             }
  200.                 s[0] = '<';
  201.                 s[s.size() - 1] = '>';
  202.                 cout << s;
  203.                 return ;
  204.         }
  205.         else {
  206.             for (int i = 1; i < s.size() - 1; i++) {
  207.                 if ((s[i] == '<') && (s[i - 1] != '>')) {
  208.                     s[i] = '$';
  209.                     break;
  210.                 }
  211.                 if ((s[i] == '>') && (s[i + 1] != '<')) {
  212.                     s[i] = '$';
  213.                     break;
  214.                 }
  215.             }
  216.             tags.clear();
  217.             cutString();
  218.             checkAll();
  219.         }
  220.     }
  221. }
  222.  
  223. int main()
  224. {
  225.     freopen("input.txt", "r", stdin);
  226.     freopen("output.txt", "w", stdout);
  227.     //freopen("xml.in", "r", stdin);
  228.     //freopen("xml.out", "w", stdout);
  229.     cin >> s;
  230.     cutString();
  231.     checkAll();
  232.     return 0;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement