Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- using namespace std;
- vector<pair<string, char>> tags(1);
- string s;
- int open, close, slash;
- void correctLetters() {
- int j;
- for (int i = 0; i < tags.size(); i++) {
- if (!tags[i].second) {
- j = i + 1;
- int h = i;
- while (h != j) {
- h++;
- if (!tags[h].second) {
- j += 2;
- }
- }
- if (tags[j].first.find("$") == -1) {
- tags[i].first = tags[j].first;
- }
- else {
- tags[j].first = tags[i].first;
- }
- }
- }
- for (int i = 0; i < tags.size(); i++) {
- if (tags[i].second) {
- cout << tags[i].first[0] << "/"
- << tags[i].first.substr(1, tags[i].first.size() - 1);
- }
- else {
- cout << tags[i].first;
- }
- }
- return;
- }
- void cutString() {
- open = 0;
- close = 0;
- slash = 0;
- tags.resize(1);
- for (int i = 0; i < s.size(); i++) {
- if (s[i] != '/') {
- tags[close].first.push_back(s[i]);
- }
- if (s[i] == '>') {
- close++;
- tags.resize(close + 1);
- }
- if (s[i] == '<') {
- open++;
- }
- if (s[i] == '/') {
- slash++;
- if ((tags[close].second == true) && (tags[close].first[0] == '<')) {
- tags[close].first.push_back('$');
- slash--;
- }
- tags[close].second = true;
- }
- }
- tags.pop_back();
- }
- void correctSlashes() {
- if (slash > open / 2) {
- vector<char> checked(tags.size());
- int j;
- for (int i = 0; i < tags.size(); i++) {
- if (!tags[i].second) {
- j = i + 1;
- int h = i;
- while (j != h) {
- h++;
- if (!tags[h].second) {
- j += 2;
- }
- }
- if (tags[i].first == tags[j].first) {
- checked[j] = true;
- }
- }
- }
- int first = -1, second;
- for (int i = 0; i < tags.size(); i++) {
- if ((!checked[i]) && (tags[i].second)) {
- if (first != -1) {
- second = i;
- break;
- }
- else {
- first = i;
- }
- }
- }
- tags[first].first = tags[second].first;
- tags[first].second = false;
- }
- else {
- //
- vector<char> checked(tags.size());
- int j;
- for (int i = tags.size() - 1; i >= 0; i--) {
- if (tags[i].second) {
- j = i - 1;
- int h = i;
- while (j != h) {
- h--;
- if (tags[h].second) {
- j -= 2;
- }
- }
- if (tags[i].first == tags[j].first) {
- checked[j] = true;
- checked[i] = true;
- }
- }
- }
- int first, second = -1;
- for (int i = tags.size() - 1; i >= 0; i--) {
- if ((!checked[i]) && (!tags[i].second)) {
- if (second != -1) {
- first = i;
- break;
- }
- else {
- second = i;
- }
- }
- }
- tags[second].first = tags[first].first;
- tags[second].second = true;
- }
- for (int i = 0; i < tags.size(); i++) {
- if (tags[i].second) {
- cout << tags[i].first[0] << "/"
- << tags[i].first.substr(1, tags[i].first.size() - 1);
- }
- else {
- cout << tags[i].first;
- }
- }
- return;
- }
- void correctMissingBreckets() {
- //if (open < slash * 2) {
- for (int i = 0; i < s.size() - 1; i++) {
- if (s[i] == '>') {
- s[i + 1] = '<';
- }
- }
- //}
- //if (open < slash * 2) {
- for (int i = 1; i < s.size(); i++) {
- if (s[i] == '<') {
- s[i - 1] = '>';
- }
- }
- //}
- s[s.size() - 1] = '>';
- s[0] = '<';
- cout << s;
- return;
- }
- void checkAll() {
- if (open == close) {
- if (slash == open / 2) {
- correctLetters();
- return ;
- }
- else {
- correctSlashes();
- return ;
- }
- }
- else {
- if (open + close < slash * 4) {
- correctMissingBreckets();
- return ;
- }
- else if (open + close == slash * 4) {
- for (int i = 1; i < s.size() - 1; i++) {
- if (s[i] == '>') {
- s[i + 1] = '<';
- }
- if ((s[i] == '<') && (s[i - 1] != '>')) {
- s[i] = '>';
- }
- }
- s[0] = '<';
- s[s.size() - 1] = '>';
- cout << s;
- return ;
- }
- else {
- for (int i = 1; i < s.size() - 1; i++) {
- if ((s[i] == '<') && (s[i - 1] != '>')) {
- s[i] = '$';
- break;
- }
- if ((s[i] == '>') && (s[i + 1] != '<')) {
- s[i] = '$';
- break;
- }
- }
- tags.clear();
- cutString();
- checkAll();
- }
- }
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- //freopen("xml.in", "r", stdin);
- //freopen("xml.out", "w", stdout);
- cin >> s;
- cutString();
- checkAll();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement