比赛 初一开训小练习 评测结果 AAAAAA
题目名称 最长前缀 最终得分 100
用户昵称 hsl_beat 运行时间 0.040 s
代码语言 C++ 内存使用 3.82 MiB
提交时间 2026-03-10 20:26:11
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int cnt;
int trie[200006][26];
bool vis[200006];
void insert(string s)
{
    int p = 0;
    for (int i = 0; i < s.length(); i++) {
        if (!trie[p][s[i] - 'A']) {
            cnt++;
            trie[p][s[i] - 'A'] = cnt;
        }
        p = trie[p][s[i] - 'A'];
    }
    vis[p] = 1;
}
bool check(string s)
{
    int p = 0;
    for (int i = 0; i < s.length(); i++) {
        if (!trie[p][s[i] - 'A']) {
            return 0;
        }
        p = trie[p][s[i] - 'A'];
    }
    return vis[p];
}
signed main()
{
    freopen("prefix.in", "r", stdin);
    freopen("prefix.out", "w", stdout);
    vector<string> v;
    string s;
    cin >> s; 
    while (s != ".") {
        insert(s);
        v.push_back(s);
        cin >> s;
    }
    string t;
    while (cin >> s) {
        t += s;
    }
    int n = t.length();
    vector<bool> dp(t.length() + 1, 0);
    t = ' ' + t;
    dp[0] = 1;
    for (int i = 1; i <= n; i++) {
        string tp;
        tp.clear();
        for (int j = i; j >= max(1ll, (int)(i - 10)); j--) {
            tp += t[j];
            auto ttp = tp;
            reverse(ttp.begin(), ttp.end());
            if (dp[j - 1] && check(ttp)) {
                dp[i] = 1;
                break;
            }
        }
    }
    for (int i = n; i >= 0; i--) {
        if (dp[i]) {
            cout << i;
            break;
        }
    }
    return 0;
}