Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <string>
- #include <cctype>
- #include <cstdlib>
- #define N 1105
- using namespace std;
- string s, sum;
- int in[N][N];
- int y = -1, x, color = 1, mx_x, mx_y;
- char out[2 * N][2 * N];
- void f(string tag) {
- if (tag[1] == '/') {
- return;
- }
- if (tag == "<table>")
- return;
- if (tag == "<tr>") {
- y++;
- mx_y = max(y, mx_y);
- x = 0;
- while (in[y][x]) {
- x++;
- mx_x = max(x, mx_x);
- }
- return;
- }
- if (tag == "<td>") {
- while (in[y][x]) x++;
- in[y][x] = color++;
- x++;
- mx_x = max(x, mx_x);
- return;
- }
- int row = 1, col = 1;
- if (tag[3] == 'c') {
- tag = tag.substr(12);
- if (tag[1] == '0') {
- tag = tag.substr(3);
- col = 10;
- }
- else {
- col = int(tag[0] - '0');
- tag = tag.substr(2);
- }
- if (tag[0] == 'r') {
- tag = tag.substr(9);
- if (tag[1] == '0') {
- tag = tag.substr(3);
- row = 10;
- }
- else {
- row = int(tag[0] - '0');
- tag = tag.substr(2);
- }
- }
- }
- else {
- tag = tag.substr(12);
- if (tag[1] == '0') {
- row = 10;
- tag = tag.substr(3);
- }
- else {
- row = int(tag[0] - '0');
- tag = tag.substr(2);
- }
- if (tag[0] == 'c') {
- tag = tag.substr(9);
- cerr << tag << endl;
- if (tag[1] == '0') {
- col = 10;
- tag = tag.substr(3);
- }
- else {
- col = int(tag[0] - '0');
- tag = tag.substr(2);
- }
- }
- }
- while (in[y][x]) x++;
- for (int i = x; i < x + col; i++)
- for (int j = y; j < y + row; j++)
- if (in[j][i]) {
- puts("ERROR");
- exit(0);
- }
- else {
- in[j][i] = color;
- mx_x = max(i, mx_x);
- mx_y = max(j, mx_y);
- }
- color++;
- }
- int main() {
- freopen("table.in", "r", stdin);
- freopen("table.out", "w", stdout);
- for (int i = 0; i < 2 * N; i++)
- for (int j = 0; j < 2 * N; j++)
- out[i][j] = ' ';
- while (cin >> s) {
- sum += s;
- }
- for (int i = 0; i < sum.size(); i++)
- if (isupper(sum[i]))
- sum[i] = tolower(sum[i]);
- s = "";
- for (int i = 0; i < sum.size(); ) {
- int pos;
- s += sum[i];
- if (sum[i] == '>')
- for (int j = i + 1; j < sum.size(); j++)
- if (sum[j] == '<') {
- i = j - 1;
- break;
- }
- i++;
- }
- sum = "";
- bool add = false;
- for (int j = s.size() - 1; j >= 0; j--) {
- if (s[j] == '>')
- add = true;
- if (add)
- sum = s[j] + sum;
- }
- for (int i = 0; i < sum.size(); ) {
- for (int j = i + 1; ; j++)
- if (sum[j] == '>') {
- string tag = sum.substr(i, j - i + 1);
- f(tag);
- i = j + 1;
- break;
- }
- }
- for (int i = 0; i < N; i++) {
- int j = 0, k;
- while (!in[i][j]) j++;
- int w;
- for (k = j; k < N; k++) {
- if (!in[i][k]) {
- break;
- }
- w++;
- }
- j = k + 1;
- }
- for (int i = 0; i < 2 * N; i++) {
- for (int j = 0; j < 2 * N; j++) {
- if ( (i % 2) ^ (j % 2) ) {
- if (i % 2) {
- if (j) {
- if (in[i / 2][j / 2] != in[i / 2][j / 2 - 1])
- out[i][j] = '|';
- }
- else
- if (in[i / 2][0])
- out[i][j] = '|';
- }
- if (j % 2) {
- if (i) {
- if (in[i / 2][j / 2] != in[i / 2 - 1][j / 2])
- out[i][j] = '-';
- }
- else
- if (in[0][j / 2])
- out[i][j] = '-';
- }
- }
- }
- }
- for (int i = 0; i < 2 * N; i++) {
- for (int j = 0; j < 2 * N; j++) {
- if (i % 2 == 0 && j % 2 == 0) {
- int s1, s2;
- if (i)
- s1 = int(out[i - 1][j] == '|') + int(out[i + 1][j] == '|');
- else
- s1 = int(out[i + 1][j] == '|');
- if (j)
- s2 = int(out[i][j - 1] == '-') + int(out[i][j + 1] == '-');
- else
- s2 = int(out[i][j + 1] == '-');
- if (s1 * s2) {
- out[i][j] = '+';
- }
- else {
- if (s1 == 2)
- out[i][j] = '|';
- if (s2 == 2)
- out[i][j] = '-';
- }
- }
- }
- }
- for (int i = 0; i < 2 * mx_y + 3; i++, putchar('\n')) {
- int pos = 2 * N - 1;
- while (out[i][pos] == ' ' && pos > 0) pos--;
- for (int j = 0; j <= pos; j++) {
- putchar(out[i][j]);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement