题目题意:

给定多个小串,在一个长串中寻找这些串的匹配次数,有些统计的是可覆盖的,有些统计的是非覆盖的

先可以简单理解一下,建立ac自动机后,当前节点包含的字符串必然被把它作为fail指针的节点包含,所以一开始写了个set[MAX],然后MLE了

如果一个当前串被完全访问了,那么这个串一定是在整个fail指针的最后面的,所以那个节点在访问中一直沿着fail指针往下走一定是能走到的,在记录一个

上一次访问的位置,就能判断当前位置是否重复覆盖了

然后根据初始记录的字符串对应的节点位置,输出在那个节点的访问次数就行了

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
using namespace std;
#define clr(x) memset(x , 0 , sizeof(x))
#define CHAR_SIZE 26
#define MAX_SIZE 600010
#define N 100005
char str[MAX_SIZE];
char s[];
int n , cnt[MAX_SIZE][];
int pos[N] , flag[N];
struct AC_Machine{
int sz , ch[MAX_SIZE][CHAR_SIZE] , fail[MAX_SIZE] , deep[MAX_SIZE] , val[MAX_SIZE] , pre[MAX_SIZE];
void init(){
sz = ;
clr(ch[]) , clr(val);
pre[] = ;
cnt[][] = cnt[][] = ;
} void insert(char *s , int p){
int n = strlen(s) , u=;
for(int i= ; i<n ; i++){
int c = s[i]-'a';
if(!ch[u][c]){
clr(ch[sz]);
cnt[sz][] = cnt[sz][] = pre[sz] = val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
deep[u] = i+;
}
val[u] = ;
pos[p] = u;
} void get_fail(){
queue<int> Q;
fail[] = ;
for(int c= ; c<CHAR_SIZE ; c++){
int u = ch[][c];
if(u) {Q.push(u);fail[u]=;}
}
while(!Q.empty()){
int r = Q.front();
val[r] |= val[fail[r]];
Q.pop();
for(int c= ; c<CHAR_SIZE ; c++){
int u = ch[r][c];
if(!u){ch[r][c]=ch[fail[r]][c] ; continue;}
fail[u] = ch[fail[r]][c];
Q.push(u);
}
}
}
}ac; void solve()
{
int cur = , n=strlen(str);
for(int i= ; i<=n ; i++){
int c = str[i-]-'a';
cur = ac.ch[cur][c];
int v = cur;
while(v && ac.val[v]){
cnt[v][]++;
// cout<<str[i-1]<<" "<<v<<endl;
if(i-ac.pre[v]>=ac.deep[v]){
cnt[v][]++;
ac.pre[v] = i;
}
v = ac.fail[v];
}
}
} int main()
{
// freopen("in.txt" , "r" , stdin);
int cas = ;
while(~scanf("%s" , str))
{
printf("Case %d\n" , ++cas);
scanf("%d" , &n);
int op;
ac.init();
for(int i= ; i<=n ; i++){
scanf("%d%s" , &op , s);
flag[i] = op;
ac.insert(s , i);
}
ac.get_fail();
solve(); for(int i= ; i<=n ; i++){
printf("%d\n" , cnt[pos[i]][flag[i]]);
}
puts("");
}
return ;
}

最新文章

  1. DB监控-redis监控
  2. 用PyAIML开发简单的对话机器人
  3. nokia5230 出厂设置
  4. Tools for Presention
  5. hibernate中有时候复杂删除有时候可以拆分为两个语句
  6. [Poetize I]守卫者的挑战
  7. 年末整理git和svn的使用心得
  8. BigDecimal-解决商业计算
  9. 快速认识HTML及一般标签
  10. 【easyui】Tab的tools按钮刷新当前tab
  11. windows server 2012 R2汉化 -- 玩转Microsoft Azure
  12. 【dp】友好城市
  13. form表单中新增button按钮,点击按钮表单会进行提交
  14. 洛谷P1073 最优贸易
  15. Ubuntu启动时a start job is running for dev-disk-by延时解决
  16. 学习笔记之Lazy evaluation
  17. Java API学习(一) ArrayList源码学习
  18. webstorm使用
  19. easyui panel异步获取后台数据在前台显示
  20. Educational Codeforces Round 15 A, B , C 暴力 , map , 二分

热门文章

  1. [html] 前端角度出发做好SEO需要考虑什么
  2. Java开发中的一些小技巧
  3. Eclipse插件Target Management (RSE)
  4. css-高度自适应的问题(body高度问题)
  5. windows+linux环境部署搭建
  6. 百度编辑器 无法获取post过去的值
  7. Machine Learning – 第2周(Linear Regression with Multiple Variables、Octave/Matlab Tutorial)
  8. [转]Android ORM系列之GreenDao最佳实践
  9. centos下vsftpd安装与配置
  10. 2016年31款轻量高效的开源JavaScript插件和库