期末考试考进前\(68.29\)名我吃shi。
题目连接:https://www.luogu.com.cn/problem/P4341
给出一个01串,按字典序输出每一个出现次数超过1的子序列的出现次数。
随机跳到这道题的。一眼\(Tire\)。
然后就当模板题打了。。。练一下手顺便白嫖一道紫。
建立一棵01\(Tire\),记录每一个点的到达次数,最后\(dfs\)一边即可。
空间过得去。
#include <cstdio>
#include <cstring>
using namespace std;
const int N=3010;
int n,tot=1,a[N],trie[N*N][2],sum[N*N];
void update(int i)
{
    int p=1;
    for (;i<=n;i++)
    {
        if (!trie[p][a[i]]) trie[p][a[i]]=++tot;
        p=trie[p][a[i]];
        sum[p]++;
    }
}
void dfs(int x)
{
    if (sum[x]>1) printf("%d\n",sum[x]);
    if (trie[x][0]) dfs(trie[x][0]);
    if (trie[x][1]) dfs(trie[x][1]);
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%1d",&a[i]);
    for (int i=1;i<=n;i++)
        update(i);
    dfs(1);
    return 0;
}原文:https://www.cnblogs.com/stoorz/p/12182378.html