제출 #448817

#제출 시각아이디문제언어결과실행 시간메모리
448817Radman_Vlak (COCI20_vlak)C++14
70 / 70
54 ms56732 KiB
//                  //
//     Radmanシ     //
//                 //
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>

using namespace std;

//#define int long long

typedef pair<int,int> pii;
typedef pair<pii,int> ppi;
typedef pair<int,pii> pip;
#define F first
#define S second

const int maxn=1e6+5;
int dp1[maxn],dp2[maxn];
string st[maxn];

struct Node
{
    Node *child[26];
    Node *par=nullptr;
    int height=-1,id=-1,c[3];
    vector<int> strings;
    Node()
    {
        for(int i=0;i<26;i++)
            child[i]=nullptr;
    }
};


struct Trie
{
    Node *root;
    int strType='a',cnt=1;
    Trie()
    {
        root=new Node();
        root->height=0;
        root->id=1;
    }
    void add(int num,int ty)
    {
        Node *cur=root;
        cur->c[ty]++;
        //cur->strings.push_back(num);
        for(char c : st[num])
        {
            int x=int(c)-strType;
            if(cur->child[x]==nullptr)
            {
                cur->child[x]=new Node();
                Node *next=cur->child[x];
                next->par=cur;
                next->height=cur->height+1;
                next->id=++cnt;
            }
            cur=cur->child[x];
            cur->c[ty]++;
            //cur->strings.push_back(num);
        }
    }
};

void find(Node *now)
{
    //cout<<"Now: "<<now->id<<endl;
    for(int i=0;i<26;i++)
    {
        Node *next=now->child[i];
        if(!next)
            continue;
        //cout<<"Next: "<<next->id<<endl;
        find(next);
        if(!dp2[next->id] and next->c[1])
            dp1[now->id]=1;
        if(!dp1[next->id] and next->c[2])
            dp2[now->id]=1;
    }
    return;
}

int32_t main()
{ 
    ios_base::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    Trie* T=new Trie;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>st[i];
        T->add(i,1);
    }
    int m;
    cin>>m;
    for(int i=n+1;i<=n+m;i++)
    {
        cin>>st[i];
        T->add(i,2);
    }
    Node *root=T->root;
    find(root);
    if(dp1[root->id])
        cout<<"Nina"<<endl;
    else
        cout<<"Emilija"<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...