ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Acwing 1053 修复DNA

2022-08-07 18:00:23  阅读:179  来源: 互联网

标签:1053 DNA int tr ++ str 字符串 include Acwing


Acwing 1053 修复DNA

题意:

给出\(n\)个字符串,这些字符串为致病因子,给出一个字符串,求将这些字符串处理成没有致病因子,最少需要改变多少个字符数量

请问,其中有多少个单词在文章中出现了。

思路:

利用AC自动机来实现多字符串匹配,设f[i][j]为,前i个字符,当前匹配到j

注意标记哪些点不可取,如果当前的前缀不可取,当前点一定也不可取,因为会包含致病因子。

实现:

#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 10010, S = 55, M = 100010;
int n, tr[N * S][27], cnt[N * S], idx;
char str[M];
int q[N * S], ne[N * S];
void insert()
{
    int p = 0;
    for (int i = 1; str[i]; i++)
    {
        int t = str[i] - 'a' + 1;
        if (!tr[p][t])
            tr[p][t] = idx++;
        p = tr[p][t];
    }
    cnt[p]++;
}
void build()
{
    int hh = 1, tt = 0;
    for (int i = 1; i <= 26; i++)
        if (tr[0][i])
            q[++tt] = tr[0][i];
    while (hh <= tt)
    {
        int t = q[hh++];
        for (int i = 1; i <= 26; i++)
        {
            int p = tr[t][i];
            if (!p)
                tr[t][i] = tr[ne[t]][i];
            else
            {
                ne[p] = tr[ne[t]][i];
                q[++tt] = p;
            }
        }
    }
}
int main()
{
    int _;
    scanf("%d", &_);
    while (_--)
    {
        memset(tr, 0, sizeof tr);
        memset(cnt, 0, sizeof cnt);
        memset(ne, 0, sizeof ne);
        idx = 1;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%s", str + 1);
            insert();
        }
        build();
        scanf("%s", str + 1);
        int res = 0;
        for (int i = 1, j = 0; str[i]; i++)
        {
            int t = str[i] - 'a' + 1;
            j = tr[j][t];
            int p = j;
            while (p)
            {
                res += cnt[p];
                cnt[p] = 0;
                p = ne[p];
            }
        }
        printf("%d\n", res);
    }
    return 0;
}

标签:1053,DNA,int,tr,++,str,字符串,include,Acwing
来源: https://www.cnblogs.com/zxr000/p/16559522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有