---
# System prepended metadata

title: 13889 - Pineapple Senpai's Big Family
tags: [class]

---

# 13889 - Pineapple Senpai's Big Family
>author: Utin
###### tags: `class`
---

## Brief
See the code below

## Solution 0

```cpp=
#include "function.h"
#include <bits/stdc++.h>
using namespace std;

int ans = 0;

void ParentA(Person* p) {
    if (!p->parentA) {
        if (p->parentB) {
            p->parentA = new Person();
            p->parentA->child = p;
            p->parentA->mate = p->parentB;
            p->parentB->mate = p->parentA;
            ans++;
        }
        else {
            p->parentA = new Person();
            p->parentA->child = p;
        }
    }
}

void ParentB(Person* p) {
    if (!p->parentB) {
        if (p->parentA) {
            p->parentB = new Person();
            p->parentB->child = p;
            p->parentB->mate = p->parentA;
            p->parentA->mate = p->parentB;
            ans++;
        }
        else {
            p->parentB = new Person();
            p->parentB->child = p;
        }
    }
}

void Mate(Person* p) {
    if (!p->mate) {
        if (p->child) {
            p->mate = new Person();
            p->mate->mate = p;
            if (p->child->parentA == p)
                p->child->parentB = p->mate;
            else p->child->parentA = p->mate;
            p->mate->child = p->child;
        }
        else {
            p->mate = new Person();
            p->mate->mate = p;
        }
        ans++;
    }
}

void Child(Person* p) {
    if (!p->child) {
        if (p->mate) {
            p->child = new Person();
            p->mate->child = p->child;
            p->child->parentA = p;
            p->child->parentB = p->mate;
        }
        else {
            p->child = new Person();
            p->child->parentA = p;
        }
    }
}

void Person::describe(string* arr, int now, int len) {
    if (now >= len) return;

    else if (arr[now] == "ParentA") {
        ParentA(this);
        this->parentA->describe(arr, now + 1, len);
    }

    else if (arr[now] == "ParentB") {
        ParentB(this);
        this->parentB->describe(arr, now + 1, len);
    }

    else if (arr[now] == "Mate") {
        Mate(this);
        this->mate->describe(arr, now + 1, len);
    }

    else if (arr[now] == "Child") {
        Child(this);
        this->child->describe(arr, now + 1, len);
    }

    else if (arr[now] == "Gender") {
        if (arr[now + 1] == "MALE") this->gender = MALE;
        else this->gender = FEMALE;
        this->describe(arr, now + 2, len);
    }

    else if (arr[now] == "Age") {
        this->age = stoi(arr[now + 1]);
        this->describe(arr, now + 2, len);
    }

    else if (arr[now] == "Name") {
        this->name = arr[now + 1];
        this->describe(arr, now + 2, len);
    }

    else if (arr[now] == "Personality") {
        if (this->personality == "") this->personality = arr[now + 1];
        else this->personality += " " + arr[now + 1];
        this->describe(arr, now + 2, len);
    }
}

Person* Person::getRelative(string* arr, int now, int len) {
    if (now == len)
        return this;

    if (arr[now] == "ParentA") {
        ParentA(this);
        return this->parentA->getRelative(arr, now + 1, len);
    }

    else if (arr[now] == "ParentB") {
        ParentB(this);
        return this->parentB->getRelative(arr, now + 1, len);
    }

    else if (arr[now] == "Mate") {
        Mate(this);
        return this->mate->getRelative(arr, now + 1, len);
    }

    else if (arr[now] == "Child") {
        Child(this);
        return this->child->getRelative(arr, now + 1, len);
    }

    else return this;
}

int getAns() {
    return ans;
}

// Utin
```

## Reference