题目大意:

  给一个串s和很多模式串,对每个模式串求s的一个最短的子串使得这个子串中包含至少k个该模式串。

题目分析:

  均摊分析,有sqrt(n)种长度不同的模式串,所以有关的串只有msqrt(n)种。暴力用AC自动机找出来即可。

代码:

  

 #include<bits/stdc++.h>
using namespace std; const int maxn = ;
const int sigma = ; int n,num,root,d[maxn],fa[maxn],fail[maxn],Ex[maxn];
string str,query[maxn];
vector<int> ans[maxn]; int Number(char ch){return (int)(ch-'a');} struct trie{int data,end,nxt[sigma];}T[maxn]; void insert(int now,int pla,int tnode){
if(pla == query[now].size()){T[tnode].end=now;return;}
int p = Number(query[now][pla]);
if(T[tnode].nxt[p]){insert(now,pla+,T[tnode].nxt[p]);}
else{
num++;T[tnode].nxt[p] = num;T[num].data = p;
fa[num] = tnode; insert(now,pla+,num);
}
} void read(){
cin >> str >> n;
for(int i=;i<=n;i++){
cin >> d[i] >> query[i];
insert(i,,root);
}
} queue <int> q;
void BuildAC(){
for(int i=;i<sigma;i++) if(T[root].nxt[i]) q.push(T[root].nxt[i]);
while(!q.empty()){
int k = q.front();q.pop();
int hh = fail[fa[k]];
while(hh != root){
if(T[hh].nxt[T[k].data]){fail[k]=T[hh].nxt[T[k].data];break;}
else hh = fail[hh];
}
if(T[hh].nxt[T[k].data]&&(!fail[k])&&T[hh].nxt[T[k].data]!=k){
fail[k]=T[hh].nxt[T[k].data];
}
for(int i=;i<sigma;i++) if(T[k].nxt[i]) q.push(T[k].nxt[i]);
}
} void BuildExtraFail(){
q.push(root);
while(!q.empty()){
int k = q.front();q.pop();
int hh = fail[k];
if(T[hh].end){Ex[k] = hh;}else Ex[k] = Ex[hh];
for(int i=;i<sigma;i++) if(T[k].nxt[i]) q.push(T[k].nxt[i]);
}
} void RunAC(){
int now = root;
for(int i=;i<str.length();i++){
int p = Number(str[i]);
if(T[now].nxt[p]) now = T[now].nxt[p];
else{
int hh = fail[now];
int fg = false;
while(hh != root){
if(T[hh].nxt[p]){fg=;now=T[hh].nxt[p];break;}
else hh = fail[hh];
}
if(fg == )goto loop;
if(T[hh].nxt[T[p].data])now=T[hh].nxt[T[p].data];
else now = root;
}
loop:int z = Ex[now];
if(T[now].end) ans[T[now].end].push_back(i);
while(z!=root){ans[T[z].end].push_back(i);z=Ex[z];}
}
} int Min(int a,int b){return a<b?a:b;} void work(){
BuildAC();
BuildExtraFail();
RunAC();
for(int i=;i<=n;i++){
if(ans[i].size()<d[i]){cout<<-<<endl;continue;}
int minn = ;
for(int j=d[i]-;j<ans[i].size();j++){
minn = Min(minn,ans[i][j]-ans[i][j-d[i]+]+query[i].length());
}
cout<<minn<<endl;
}
} int main(){
read();
work();
return ;
}

Codeforces963C Frequency of String 【字符串】【AC自动机】的更多相关文章

  1. 模板—字符串—AC自动机(多模式串,单文本串)

    模板—字符串—AC自动机(多模式串,单文本串) Code: #include <queue> #include <cstdio> #include <cstring> ...

  2. HDU 6096 String(AC自动机+树状数组)

    题意 给定 \(n\) 个单词,\(q\) 个询问,每个询问包含两个串 \(s_1,s_2\),询问有多少个单词以 \(s_1\) 为前缀, \(s_2\) 为后缀,前后缀不能重叠. \(1 \leq ...

  3. [coci2012]覆盖字符串 AC自动机

    给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2.Mirko的 ...

  4. 【ZOJ 3228】Searching the String 【AC自动机】

    题意 给出n个模式串和一个文本串,输出各个模式串在文本串中出现的次数.模式串有两种类型,0类型代表可以有重叠,1类型代表不能有重叠.模式串可能出现重复. 分析 算是AC自动机的模板题? 因为模式串可以 ...

  5. HDU - 6096 :String (AC自动机,已知前后缀,匹配单词,弱数据)

    Bob has a dictionary with N words in it. Now there is a list of words in which the middle part of th ...

  6. ZOJ3228 Searching the String (AC自动机)

    Searching the String Time Limit: 7 Seconds                                      Memory Limit: 129872 ...

  7. 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP

    [bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...

  8. 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机

    [bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...

  9. Substring Frequency (II) LightOJ - 1427 AC自动机

    https://vjudge.net/problem/LightOJ-1427 把所有模式串加入ac自动机,然后search的时候暴力,每个子串都暴力一下就好. 其实AC自动机就是,先建立好trie图 ...

随机推荐

  1. Item 19: 使用srd::shared_ptr来管理共享所有权的资源

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 使用带垃圾回收机制语言的程序员指出并嘲笑C++程序员需要遭受防止资 ...

  2. 朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件

    朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件 [下载本文PDF进行阅读] 一般而言中间件和框架的区别是,中间件是独立运行的用于处理某项专门业务的CS程序,会有配套的客户端和服务端,框架虽然也 ...

  3. poj2104 主席树裸题

    空间大小:n*lgn 复杂度:建树n*lgn  查询lgn #include <cstdio> #include <iostream> #include <algorit ...

  4. c++入门之类——进一步剖析

    通常的,关于一个类,包含了下面几个方面: 1  声明类成员和接口:2 定义类接口函数(方法)3通过接口调用类 下面先给出第一条:声明类成员和接口 # ifndef MYTIME0_H_ # defin ...

  5. emplace与insert的区别(C++11)

    转自时习之 C++11中大部分的容器对于添加元素除了传统的 insert 或者 pusb_back/push_front 之外都提供一个新的函数叫做 emplace. 比如如果你想要向 std::ve ...

  6. vant的坑

    1.轮播图设置, .img { width: 100%; height: 100%; object-fit: cover; touch-action: none; } 如果不设置不能达到 保持纵横比缩 ...

  7. Hbase 架构体系

    有2个节点进程,一个是master,另一是regionserver.

  8. input & collapse & tags

    input & collapse & tags https://ant.design/components/tag-cn/ https://www.iviewui.com/compon ...

  9. pycharm 安装

    pycharm 1.模板 file->setting->Editor->file and code template->python script->右上方 #!/usr ...

  10. linux 查看TCP端口

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ netstat –nat