7-10 L язык PTA C++ ответы на вступительные вопросы

7-10 л языка

оценка 90

Просмотр тем в полноэкранном режиме

переключить раскладку

Автор tan60 unit Ланьчжоуский университет

Знаки препинания появились позже слов, поэтому в предыдущих языках пунктуации не было. Теперь вы имеете дело с абзацем без знаков препинания. Абзац Т состоит из нескольких строчных букв. Слово W также состоит из нескольких строчных букв. Словарь D представляет собой набор слов. Мы говорим, что часть статьи Т может быть понята по некоторому словарю D, что означает, что если артикль Т можно разделить на несколько частей, и каждая часть является словом в словаре D. Например, в словарь D входят слова {'is', 'name', 'what', 'your'}, тогда артикль 'whatisyourname' можно понимать под словарем D, поскольку он делится на 4 слова: 'what ', 'is', 'ваш', 'имя', и каждое слово принадлежит словарю D, а артикль 'whatisyouname' не может быть понят в словаре D, но может быть понят в словаре D'=D+{' ты'} . Префикс этого отрывка, «что такое», также понимается в словаре D и является самым длинным префиксом, понятным в словаре D. Учитывая словарь D, ваша программа должна оценить, можно ли понять несколько абзацев статей в словаре D. И укажите позицию самого длинного префикса, который можно понять по словарю D.

Формат ввода:

Первая строка входного файла содержит два целых положительных числа n и m, означающих, что в словаре D имеется n слов и необходимо обработать m абзацев статей. Каждая из следующих n строк описывает слово, а каждая из следующих m строк описывает артикль. Среди них 1<=n, m<=20, длина каждого слова не превышает 10, а длина каждой статьи не превышает 1M.

Выходной формат:

Для каждого входного пассажа нужно вывести позицию самого длинного префикса этого пассажа, который можно понять в словаре D.

Входной образец:

Здесь указан набор входных данных. Например:

4 3
is
name
what
your
whatisyourname
whatisyouname
whaisyourname

Пример вывода:

Соответствующий вывод приведен здесь. Например:

14
6
0

намекать

Весь отрывок "как тебя зовут" можно понять

Приставка «что есть» понимается

никакие префиксы не понимаются

Ограничение длины кода 16 КБ

Ограничение по времени 400 мс

Ограничение памяти 64 МБ

Отвечать

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
//ios::sync_with_stdio(false);
using namespace std;
const int N = 1000100;
const int M = 200100;
const LL mod = 1e9 + 7;
int tr[N][30], val[N];
int rt;
int ans[N];
void add(string s) 
{
    int k = 0;
    for (int i = 0; i < s.length(); i++) 
    {
        int d = s[i] - 'a';
        if (!tr[k][d]) tr[k][d] = ++rt;
        k = tr[k][d];
    }
    val[k] = 1;//单词终止结点 
}
void search(string s) 
{
    int k = 0;
    memset(ans, 0, sizeof(ans));
    for (int i = 0; i < s.length(); i++) 
    {
        int d = s[i] - 'a';
        if (!tr[k][d]) break;
        k = tr[k][d];
        if (val[k]) ans[i] = 1;//这个点是单词尾点 
    }
    int bb = 0;
    for (int i = 0; i < s.length(); i++) 
    {
        if (ans[i]) bb = i + 1;
        else continue;
        int k = 0;
        for (int j = i + 1; j < s.length(); j++) 
        {
            int d = s[j] - 'a';
            if (!tr[k][d]) break;
            k = tr[k][d];
            if (val[k]) ans[j] = 1;
        }
    }
    cout << bb << endl;
}
int main() 
{
    ios::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    string s;
    for (int i = 1; i <= n; i++) 
    {
        cin >> s;
        add(s);
    }
    for (int i = 1; i <= m; i++) 
    {
        cin >> s;
        search(s);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/lifesize/article/details/128945208
おすすめ