Skip to content

455B

Tutorial

Trie can be implemented with a two dimentional array.

Solution

#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define D(x) x

const int MAX_CHAR_NUM = 30;
const int MAX_N = int(1e5) + 10;
const int MAX_NODE_NUM = MAX_N;

int trie[MAX_NODE_NUM][MAX_CHAR_NUM];
int node_num;

int n, round_num;
char st[MAX_N];
bool leaf;

void trie_init()
{
    memset(trie, -1, sizeof(trie));
    node_num = 1;
}

int convert(char ch)
{
    return ch - 'a';
}

void add(char* st)
{
    int u = 0;
    for (int i = 0; st[i]; i++)
    {
        int index = convert(st[i]);
        if (trie[u][index] == -1)
        {
            trie[u][index] = node_num++;
        }
        u = trie[u][index];
    }
}

void input()
{
    scanf("%d%d", &n, &round_num);
    for (int i = 0; i < n; i++)
    {
        scanf("%s", st);
        add(st);
    }
}

bool dfs(int u)
{
    bool have_child = false;
    bool ret = false;
    for (int i = 0; i < 26; i++)
    {
        if (trie[u][i] != -1)
        {
            have_child = true;
            ret = ret || !dfs(trie[u][i]);
        }
    }
    if (have_child)
        return ret;
    return leaf;
}

void output()
{
    for (int i = 0; i < 24; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            printf("%d ", trie[i][j]);
        }
        puts("");
    }
}

int main()
{
    trie_init();
    input();
    leaf = false;
    bool win = dfs(0);
    leaf = true;
    bool lose = dfs(0);
    if (win && lose)
    {
        puts("First");
    }else if (win && !lose)
    {
        if (round_num & 1)
            puts("First");
        else
            puts("Second");
    }else if (!win)
    {
        puts("Second");
    }
    return 0;
}