1 条题解

  • 0
    @ 2025-10-8 16:50:58
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2e6 + 10;
    char s[N];
    int ch[N][26], id, pre[N], sum[N], ys[N];
    void ins(char *s, int x)
    {
        int p = 0;
        for (int i = 0; s[i]; i++)
        {
            int j = s[i] - 'a';
            if (ch[p][j] == 0)
                ch[p][j] = ++id;
            p = ch[p][j];
        }
        ys[x] = p;
    }
    void build()
    {
        queue<int> Q;
        for (int i = 0; i < 26; i++)
            if (ch[0][i])
                Q.push(ch[0][i]);
        while (Q.size())
        {
            int x = Q.front();
            Q.pop();
            for (int i = 0; i < 26; i++)
            {
                int y = ch[x][i];
                if (y == 0)
                    ch[x][i] = ch[pre[x]][i];
                else
                    pre[y] = ch[pre[x]][i];
                Q.push(y);
            }
        }
    }
    void query(char *s)
    {
        int p = 0;
        for (int i = 0; s[i]; i++)
        {
            p = ch[p][s[i] - 'a'];
            sum[p]++;
        }
    }
    vector<int> G[N];
    void dfs(int x)
    {
        for (int y : G[x])
        {
            dfs(y);
            sum[x] += sum[y];
        }
    }
    int main()
    {
        int n;
        scanf("%d", &n);
        id = 0;
        memset(ch, 0, sizeof(ch));
        for (int i = 1; i <= n; i++)
        {
            scanf("%s", s);
            ins(s, i);
        }
        memset(pre, 0, sizeof(pre));
        build();
        scanf("%s", s);
        memset(sum, 0, sizeof sum);
        query(s);
        for (int i = 1; i <= id; i++)
            G[pre[i]].push_back(i);
        dfs(0);
        for (int i = 1; i <= n; i++)
            printf("%d\n", sum[ys[i]]);
        return 0;
    }
    
    • 1

    信息

    ID
    504
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    169
    已通过
    27
    上传者