首页 > 其他分享 >HDU-3065 病毒侵袭持续中

HDU-3065 病毒侵袭持续中

时间:2022-08-17 18:45:38浏览次数:66  
标签:char HDU nex int tr 侵袭 3065

思路:
AC自动机模板题,最后拓扑优化即可,存下每个单词结尾的编号,通过编号找出它是否被遍历过。
注意:该题是多组案例。

实现:

#include <stdio.h>
#include <string.h>
const int N = 2e6 + 5, M = 50005;
int tr[M][26], idx = 1, nex[M], q[M], id[M], f[M];
char s[N];
char t[1005][55];
void insert(char s[], int x)
{
    int p = 0;
    int len = strlen(s + 1);
    for (int i = 1; i <= len; i++)
    {
        int t = s[i] - 'A';
        if (!tr[p][t])
            tr[p][t] = idx++;
        p = tr[p][t];
    }
    id[x] = p;
}
void build()
{
    int hh = 1, tt = 0;
    for (int i = 0; i < 26; i++)
        if (tr[0][i])
            q[++tt] = tr[0][i];
    while (hh <= tt)
    {
        int t = q[hh++];
        for (int i = 0; i < 26; i++)
        {
            int &p = tr[t][i];
            if (!p)
                p = tr[nex[t]][i];
            else
            {
                nex[p] = tr[nex[t]][i];
                q[++tt] = p;
            }
        }
    }
}
int main()
{

    int n;
    while (scanf("%d", &n) != EOF)
    {
        memset(tr, 0, sizeof tr);
        memset(nex, 0, sizeof nex);
        memset(f, 0, sizeof f);
        idx = 1;
        for (int i = 1; i <= n; i++)
        {
            scanf("%s", t[i] + 1);
            insert(t[i], i);
        }
        build();
        scanf("%s", s + 1);
        int len = strlen(s + 1);
        for (int i = 1, j = 0; i <= len; i++)
        {
            int t = s[i] - 'A';
            if (t < 0 || t > 25)
            {
                j = 0;
                continue;
            }
            j = tr[j][t];
            f[j]++;
        }
        for (int i = idx - 1; i >= 1; i--)
            f[nex[q[i]]] += f[q[i]];
        for (int i = 1; i <= n; i++)
        {
            if (f[id[i]])
            {
                int len = strlen(t[i] + 1);
                for (int j = 1; j <= len; j++)
                    printf("%c", t[i][j]);
                printf(": ");
                printf("%d\n", f[id[i]]);
            }
        }
    }
    return 0;
}

标签:char,HDU,nex,int,tr,侵袭,3065
From: https://www.cnblogs.com/zxr000/p/16596374.html

相关文章

  • HDU - 2896 病毒侵袭
    思路:AC自动机模板题,最后拓扑优化即可。注意:该题行末有空格会PE。该题是所有ASCII值,所以遍历的时候不能遍历到26,取字母的时候不能-'a'实现:#include<stdio.h>#incl......
  • hdu7226
    题面给出一个排列,把每个位置视为点,建一个无向图,\(i,j\)之间的边权为\(|i-j|\times|p_i-p_j|\)。求这个图的最小生成树。数据范围:\(n\le5\times10^4\)。题解这......
  • HDU - 2222 Keywords Search
    思路:AC自动机模板+拓扑优化。因为当前单词可能包含别的单词,所以需要一直nex,但是本题会超时,所以思考优化这个过程。我们知道,拓扑优化,可以将所有出现过的字符都标记上,这......
  • 2022HDU多校第七场
    2022HDU多校第七场过程本场队友上场秒了08,是昨天刚出现的nim博弈,随后04模拟分类讨论,我巨大演员wa了2发过了,随后03一眼树形dp,想了想计数方法,随后忘情况演了一发,然后就过了......
  • hdu7215 Weighted Beautiful Tree
    problem一个点的点权的可能为不变或者变为连着的边的边权。然后dp、dp[u][0]表示变成大于等于w[u]边的最小代价。dp[u][1]表示变成小于等于w[u]边的最小代价。然后对......
  • hdu7207-Find different【burnside引理】
    正题题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=7207题目大意一个序列\(a\),和它相同的序列当且仅当能通过以下操作实现相同:将\(a_1\)丢到\(a_n\),其余的向......