首页 > 其他分享 >Tinkoff Internship Warmup Round 2018 and Codeforces Round 475 (Div. 1) D. Frequency of String

Tinkoff Internship Warmup Round 2018 and Codeforces Round 475 (Div. 1) D. Frequency of String

时间:2023-09-22 19:13:44浏览次数:43  
标签:std aca String Warmup int tr vector que Round

Problem - D - Codeforces

题意

给定一个字符串,n次询问,每次询问一个字符串在给定字符串的子串中出现k次时子串的最小长度

分析

多模式匹配,想到使用AC自动机,由于询问子串总长度不超过M = 1E5,那么对于长度不同的串最多有$\sqrt{M}$,那么我们队fail树中最长的链长度小于$\sqrt{M}$,对原串中的每个位置直接沿着fail指针向上传递,则共传递n$\sqrt{M}$次,最后对每次询问统计答案

#include <bits/stdc++.h>

using i64 = long long;

struct ACA
{
    std::vector<std::array<int, 26>> tr;
    std::vector<int> ne;
    std::vector<int> len;
    std::vector<int> invid;
    std::vector<int> cnt;
    std::vector<int> q;
    std::vector<std::vector<int>> adj;
    std::vector<std::pair<int, int>> que;
    int idx;

    ACA(int n) : tr(n + 1), ne(n + 1), invid(n + 1), len(n + 1), cnt(n + 1), q(n + 1), que(n + 1)
    {
        adj.assign(n + 1, std::vector<int>());
        idx = 0;
    }

    void insert(std::string s, int x, int k)
    {
        int p = 0;
        int sz = s.size();
        for (int i = 0; i < sz; i++)
        {
            int t = s[i] - 'a';
            if (!tr[p][t])
                tr[p][t] = ++idx;
            p = tr[p][t];
        }
        len[p] = s.size();
        que[p] = {k, x};
        invid[x] = p;
    }

    void build()
    {
        int hh = 0, tt = -1;
        for (int i = 0; i < 26; i++)
            if (tr[0][i])
                q[++tt] = tr[0][i];
        while (hh <= tt)
        {
            int p = q[hh++];
            adj[ne[p]].push_back(p);
            for (int i = 0; i < 26; i++)
                if (!tr[p][i])
                    tr[p][i] = tr[ne[p]][i];
                else
                {
                    ne[tr[p][i]] = tr[ne[p]][i];
                    q[++tt] = tr[p][i];
                }
        }
    }

    void query(std::string str)
    {
        int sz = str.size();
        for (int i = 0, now = 0; i < sz; i++)
        {
            int t = str[i] - 'a';
            now = tr[now][t];
            int p = now;
            cnt[p]++; // 对应的节点加一,在最后bfs是保证前节点全部加一
        }
    }

    void dfs(int u)
    {
        for (auto v : adj[u])
        {
            dfs(v);
            cnt[u] += cnt[v];
        }
    }
};

constexpr int N = 1E5;

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::string str;
    std::cin >> str;
    ACA aca(N);
    int n;
    std::cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int k;
        std::string s;
        std::cin >> k >> s;
        aca.insert(s, i, k);
    }

    aca.build();
    std::vector<int> up(N + 1);
    auto dfs1 = [&](auto self, int u, int last) -> void
    {
        up[u] = last;
        if (aca.que[u].second)
            last = u;
        for (auto v : aca.adj[u])
            self(self, v, last);
    };

    std::vector<std::vector<int>> id(n + 1, std::vector<int>());

    dfs1(dfs1, 0, 0);
    int sz = str.size();
    for (int i = 0, now = 0; i < sz; i++)
    {
        int t = str[i] - 'a';
        now = aca.tr[now][t];
        if (aca.que[now].first)
            id[aca.que[now].second].push_back(i);
        int p = up[now];
        while (p)
        {
            id[aca.que[p].second].push_back(i);
            p = up[p];
        }
    }
    for (int i = 1; i <= n; i++)
    {
        int invid = aca.invid[i];
        auto [k, z] = aca.que[invid];
        if (id[i].size() < k)
            std::cout << -1 << "\n";
        else
        {
            int res = 1E9;
            for (int j = k - 1; j < id[i].size(); j++)
                res = std::min(res, id[i][j] - id[i][j - k + 1] + aca.len[invid]);
            std::cout << res << "\n";
        }
    }

    return 0;
}

标签:std,aca,String,Warmup,int,tr,vector,que,Round
From: https://www.cnblogs.com/muxinchegnfeng/p/17723169.html

相关文章

  • # [Codeforces Round 898 (Div. 4)] E. Building an Aquarium
    CodeforcesRound898(Div.4)E.BuildinganAquariumYoulovefish,that'swhyyouhavedecidedtobuildanaquarium.Youhaveapieceofcoralmadeof\(n\)columns,the\(i\)-thofwhichis\(ai\)unitstall.Afterwards,youwillbuildat......
  • Codeforces Round 898 (Div. 4)
    CodeforcesRound898(Div.4)A.ShortSort解题思路:遍历所有交换情况,看是否有\(abc\).代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;constintM=2*M;typedefpair<int,int>pii;#definefifirst#define......
  • Java 21的StringBuilder和StringBuffer新增了一个repeat方法
    发现Java21的StringBuilder和StringBuffer中多了repeat方法:/***@throwsIllegalArgumentException{@inheritDoc}**@since21*/@OverridepublicStringBuilderrepeat(intcodePoint,intcount){super.repeat(codePoint,co......
  • 一次性搞懂JS字符串截取方法substring()、slice()以及substr()的用法和区别
    substring()和slice()都接受两个参数,“start”和“end”。“start”表示截取的开始位置,“end”表示结束的位置(不包括该位置的字符,也就是前要后不要)。如果不传参数,则返回字符串本身的一个副本。 如果只传一个参数,则从该位置开始,截取到字符串的末尾。 如果传递两个参数,则......
  • String.format()的使用
    java.lang.String包下自带的格式化静态方法1.简单示例Stringa=String.format("你好!%s","小扬子");System.out.println(a);输出结果:Hello小扬子%s为占位符标识,s对应字符串类型参数2.对字符串进行格式化Stringa="hello";Stringb="hi";Stringstr=Stri......
  • 已解决TypeError: type numpy.ndarray doesn‘t define __round__ method
    已解决TypeError:typenumpy.ndarraydoesn’tdefineroundmethod文章目录报错问题解决方法声明报错问题之前在工作中遇到过这个坑,记录一下问题以及解决方法,不一定针对所有情况都能用,但是可以供大家参考。问题描述如下:TypeError:typenumpy.ndarraydoesn’tdefineroundm......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)
    Preface这场因为晚上去做大物实验了,到寝室洗完澡都11点了,就没现场打了的说后面补题发现前5题都很一眼,虽然补题的时候E题FST了(T在了42个点,如果放在比赛就FST了),F题还是很有意思的一个题目的说A.MEXanizedArray简单讨论一下即可#include<cstdio>#include<iostream>#include......
  • Educational Codeforces Round 123 - D(思维题)
    目录D.CrossColoringD.CrossColoring题意$n\timesm$的方格纸上进行q次操作,每次操作选择某整行x和某整列y,使得行x和列y均涂上k种颜色中的一种。问你最终的方案数思路倒序考虑操作,因为对于同一行或者同一列,后面的操作覆盖前面的操作利用数组标记某行或者某......
  • 关于hive中的com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Strin
    com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V这个报错是因为Hive 3.1.3guava19.jar和hadoop3.2.4不兼容导致 解决方法—— 之后hive就可以正常初始化了  参考博客——https://blog.csdn.net/happyfreeangel/ar......
  • JS 对象(Object)和字符串(String)互转
    利用原生JSON对象,将对象转为字符串1.varjsObj={};2.jsObj.testArray=[1,2,3,4,5];3.jsObj.name='CSS3';4.jsObj.date='8May,2011';5.varstr=JSON.stringify(jsObj);6.alert(str);从JSON字符串转为对象1.varjsObj={};2.jsObj.......