1 条题解

  • 0
    @ 2025-10-8 17:07:49
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e6 + 10;
    char str[N];
    int ch[N][26], id, pre[N], sum[N], a[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];
            sum[p]++;
        }
        a[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) y = ch[pre[x]][i];
                else pre[y] = ch[pre[x]][i], Q.push(y);
            }
        }
    }
    
    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)); memset(sum, 0, sizeof sum);
        for (int i = 1; i <= n; i++) scanf("%s", str), ins(str, i);
        memset(pre, 0, sizeof(pre)); build();
        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[a[i]]);
        return 0;
    }
    
    • 1

    信息

    ID
    4837
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    76
    已通过
    22
    上传者