HDU 4416 Good Article Good sentence

Problem : 给一个串S,和一些串T,询问S中有多少个子串没有在T中出现。
Solution :首先对所有的T串建立后缀自动机,统计出本质不同的子串个数ans1,再将S串插入后缀自动机,统计出本质不同的子串个数ans2,则答案即为ans2-ans1。
将多个串插入后缀自动机,只需要每次将last赋值为root即可。

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;const int N = 1000008;struct Suffix_Automaton
{int nt[N << 1][26], a[N << 1], fail[N << 1];int tot, last, root;int p, q, np, nq;int newnode(int len){for (int i = 0; i < 26; ++i) nt[tot][i] = -1;fail[tot] = -1; a[tot] = len; return tot++;}void clear(){tot = last = 0; root = newnode(0);}void insert(int ch){p = last; last = np = newnode(a[p] + 1); for (; ~p && nt[p][ch] == -1; p = fail[p]) nt[p][ch] = np;if (p == -1) fail[np] = root;else{q = nt[p][ch];if (a[p] + 1 == a[q]) fail[np] = q;else{nq = newnode(a[p] + 1);for (int i = 0; i < 26; ++i) nt[nq][i] = nt[q][i];fail[nq] = fail[q];fail[np] = fail[q] = nq;for (; ~p && nt[p][ch] == q; p = fail[p]) nt[p][ch] = nq;}}}long long solve(){long long ans = 0;for (int i = 1; i < tot; ++i) ans += a[i] - a[fail[i]];return ans;}
}sam;int main()
{cin.sync_with_stdio(0);int T; cin >> T;for (int cas = 1; cas <= T; ++cas){sam.clear();int n; cin >> n;string s; cin >> s;for (int i = 1; i <= n; ++i){string t; cin >> t;sam.last = 0;for (int j = 0, len = t.length(); j < len; ++j)sam.insert(t[j] - 'a');}long long ans1 = sam.solve();sam.last = 0;for (int j = 0, len = s.length(); j < len; ++j)sam.insert(s[j] - 'a');long long ans2 = sam.solve();cout << "Case " << cas << ": " << ans2 - ans1 << endl;}
}

转载于:https://www.cnblogs.com/rpSebastian/p/7218916.html

HDU 4416 (后缀自动机)相关推荐

  1. HDU 4416 后缀自动机

    题意:多组样例t,每个样例一个数n,接下来一个字符串 T ,n个字符串S,问T的子串有多少没有在S中出现 解:先将n个字符串加入后缀自动机,统计子串个数 ans,再把T加入后缀自动机,统计字符串个数a ...

  2. 不在B中的A的子串数量 HDU - 4416 (后缀自动机模板题目)

    题目: 给定一个字符串a,又给定一系列b字符串,求字符串a的子串不在b中出现的个数. 题解: 先将所有的查询串放入后缀自动机(每次将sam.last=1)(算出所有子串个数) 然后将母串放入后缀自动机 ...

  3. HDU 6194 后缀自动机

    后缀自动机求K次出现的子串的个数: #include <iostream> #include<cstdio> #include<algorithm> #includ ...

  4. hdu 4416 后缀数组

    昨天做1007,做到吐血,一直wa,原来是结果是超int的,好容易算错啊,刚刚好觉得是10位,没超, 但是那是10位0,还有最高为1啊,又范这种低级错误了,引以为戒,不要在范. 先说一下我的做法,利用 ...

  5. HDU 3518 HDU 4416【后缀自动机len的使用】

    max:即代码中 len 变量,它表示该状态能够接受的最长的字符串长度. min:表示该状态能够接受的最短的字符串长度.实际上等于该状态的 fail 指针指向的结点的 len + 1. max-min ...

  6. HDU - 4416 Good Article Good sentence(广义后缀自动机/后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,再给出 n 个字符串 t ,现在问字符串 s 中有多少个不同的子串满足不是 t1 ~ tn 中任意一个字符串的子串 题目分析:第一次接触这样的题目, ...

  7. hdu 6194string string string 后缀自动机

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 查询原串中出现次数等于k次的子串数量.需要用到基数排序. 构造完后缀自动机之后将节点按照maxl ...

  8. HDU多校4 - 6988 Display Substring(后缀自动机+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss,每个字母都有一个权值,现在要求所有本质不同子串中权值和第 kkk 大的权值 题目分析:如果没有本质不同,那有一个很简单的二分套二 ...

  9. HDU - 4641 K-string(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,规定 K-string 为字符串 s 中出现次数大于等于 k 次的字串,现在有 m 次操作,每次操作有两种: 1 ch:在字符串 s 后面添加字符 ...

最新文章

  1. capistrano部署ruby on rails应用
  2. Spring3 @ResponseBody注解引起头部Accept-Charset过大
  3. X小时速通《物联网导论》
  4. 程序员过关斩将--应对高并发系统有没有通用的解决方案呢?
  5. html获取当前ip地址_科普文:Node.js 安全攻防 - 如何伪造和获取用户真实 IP ?
  6. PCL计算点到直线距离
  7. win10无法正常弹出移动硬盘/U盘
  8. 基于Python的电商数据分析系统
  9. 【Android】模拟Android微信APK底部的TabHost选项卡
  10. python f检验 模型拟合度_模型评估指标(RMSE、MSE、MAE、R2准确率、召回率、F1、ROC曲线、AUC曲线、PR曲线)...
  11. 修改内部emmc 和外部sdcard 挂载点
  12. 火山火花代码编辑框(火花编辑框)Scintilla代码编辑框案例教程
  13. ffmpeg-nvenc
  14. python中的sort排序加换行_python中sort()排序的方法
  15. 恕我直言,赚钱真的不是靠拼命
  16. poi3.17导出excel添加附件解决办法
  17. linux内核栈与用户栈及调用栈观察方法
  18. 华为官网鸿蒙系统手机安装链接,华为鸿蒙系统手机版
  19. 洞悉物联网发展1000问之软银孙正义的最新三大投资秘诀是什么?
  20. vue改变html的背景,vue动态改变背景图片demo分享

热门文章

  1. 后台管理系统项目-登录页-实现步骤
  2. jQuery - end方法的用法
  3. python提取excel内容
  4. es拼音分词 大帅哥_SpringBoot集成Elasticsearch 进阶,实现中文、拼音分词,繁简体转换...
  5. 深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080/980ti+CUDA8.0
  6. 使用 GPG 为极狐GitLab git commit 签名
  7. win10启动修复_win10开机死循环无限重启怎么解决?
  8. KaTex数学公式编辑器相关
  9. 读书笔记(二十三):代码整洁
  10. 一加7t人脸识别_600美元起售:一加7T真机抢先看 90Hz屏/环形3摄