自我感觉良好
查看原帖
自我感觉良好
339311
mori_楼主2023/7/12 21:24
//
// Created by Mori on 2023/7/12.
//

#include <bits/stdc++.h>

using namespace std;

int read() {
    int res = 0;
    bool f = false;
    char temp = getchar();
    for (; !isdigit(temp); temp = getchar()) f = temp == '-';
    for (; isdigit(temp); temp = getchar()) res = res * 10 + temp - '0';
    if (f) return -res;
    return res;
}

char gc() {
    char temp = getchar();
    while (temp == '\n' || temp == '\r' || temp == ' ') temp = getchar();
    return temp;
}

constexpr int maxn = 2e7 + 5;
char line[maxn];
int trie[maxn][26], cnt = 1, pos[maxn], cc[maxn], tot[maxn];

int dfs(int u, const int c) {
    int res = tot[trie[u][c]];
    for (int v: trie[u]) {
        if (!v) continue;
        res += dfs(v, c);
    }
    return res;
}

int main() {
    int n = read();
    for (int i = 1; i <= n; i++) {
        scanf("%s", line + 1);
        int len = strlen(line + 1);
        int it = 1;
        for (int j = len; j > 1; j--) {
            int v = line[j] - 'a';
            if (!trie[it][v]) trie[it][v] = ++cnt;
            it = trie[it][v], ++tot[it];
        }
        {
            int v = line[1] - 'a';
            pos[i] = it, cc[i] = v;
            if (!trie[it][v]) trie[it][v] = ++cnt;
            it = trie[it][v], ++tot[it];
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; i++)
        ans += dfs(pos[i], cc[i]);
    cout << ans - n;
    return 0;
}
2023/7/12 21:24
加载中...