题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4416
题意:给一个A串和多个B串,求A串中有多少个子串不是任何一个B串的子串。
分析:统计子串的个数,最直接的就想到后缀自动机。首先把第一个串建成后缀自动机,当把其他的串加入的时候,我们首先让last指针指向根节点,然后与单串类似,逐个加入字符,不同的是现在的当前后缀可能是原本的某个后缀,即ch[last][c]!=nullch[last][c]!=null,这时候需要比较ml[ch[last][c]]ml[ch[last][c]]是否和ml[p]+1ml[p]+1是否相等(与构造算法类似,不明白的话可以把abab ba 画出来就懂了)

#include<bits/stdc++.h>
using namespace std;
const int Maxn=4023456;
typedef long long Int;
char s[100020];
int n,cs=1;struct suffix_automaton
{int ml[Maxn],f[Maxn],ch[Maxn][26];int sz,last,maxlen;int col[Maxn];int id[Maxn],cnt[100020];void init(){memset(ch[1],0,sizeof(ch[1]));sz=2;last=1;}int getidx(char c){return c-'a';}void add(char x,int w){int c=getidx(x);int p=last;if(ch[p][c]){if(ml[ch[p][c]]==ml[p]+1){last=ch[p][c];col[last]=w;}else{int nq=sz++,q=ch[p][c];last=nq;col[nq]=w;memcpy(ch[nq],ch[q],sizeof(ch[q]));ml[nq]=ml[p]+1;f[nq]=f[q];f[q]=nq;for(;p&&ch[p][c]==q;p=f[p])ch[p][c]=nq;}return;}int np=sz++;ml[np]=ml[p]+1;last=np;col[np]=w;memset(ch[np],0,sizeof(ch[np]));for(;p&&!ch[p][c];p=f[p])ch[p][c]=np;if(!p){f[np]=1;return;}int q=ch[p][c];if(ml[q]==ml[p]+1){f[np]=q;return;}int nq=sz++;col[nq]=w;memcpy(ch[nq],ch[q],sizeof(ch[q]));ml[nq]=ml[p]+1;f[nq]=f[q];f[q]=nq;for(;p&&ch[p][c]==q;p=f[p])ch[p][c]=nq;f[np]=nq;}void solve(){scanf("%s",s);int i,j;for(i=0;s[i];i++)add(s[i],1);maxlen=i;for(i=0;i<n;i++){last=1;scanf("%s",s);for(j=0;s[j];j++)add(s[j],0);maxlen=max(maxlen,j);}for(i=1;i<=maxlen;i++)cnt[i]=0;for(i=1;i<sz;i++)cnt[ml[i]]++;for(i=1;i<=maxlen;i++)cnt[i]+=cnt[i-1];for(i=1;i<sz;i++)id[cnt[ml[i]]--]=i;for(i=sz-1;i>=1;i--)col[f[id[i]]]&=col[id[i]];Int ans=0;for(i=1;i<sz;i++)if(col[i])ans+=ml[i]-ml[f[i]];printf("Case %d: %lld\n",cs++,ans);}
}solver;
int main()
{int _;scanf("%d",&_);while(_--){scanf("%d",&n);solver.init();solver.solve();}
}

hdu4416[多串后缀自动机]相关推荐

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

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

  2. hdu4416 Good Article Good sentence(多个串的本质不同的串个数,后缀自动机)

    题意: 给定串S,和若干个串T(i), 问有多少个S的本质不同的子串,在所有T(i)中没有出现过 数据范围:|S|<=1e5,,sum(|T|)<=1e5 解法: 将所有T串插入后缀自动机 ...

  3. [hdu4416 Good Article Good sentence]后缀自动机SAM

    题意:给出串A和串集合B={B1,B2,...,Bn},求串A的所有不同子串中不是B中任一串的子串的数目. 思路:把A和B中所有字符串依次拼接在一起,然后构造后缀自动机,计算每个状态的R集合元素的最大 ...

  4. CodeForces - 427D Match Catch(后缀数组/广义后缀自动机)

    题目链接:点击查看 题目大意:给出两个字符串,求出两个字符串中的最短公共子串,且在每个字符串中只出现过一次 题目分析:因为这个公共子串只能在字符串中出现一次,考虑到用后缀数组,我们先将两个字符串通过特 ...

  5. 【BZOJ3926】【Zjoi2015】诸神眷顾的幻想乡 广义后缀自动机

    链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...

  6. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

  7. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做...

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. 1 #include <cstdlib> 2 ...

  8. 【POJ1509】Glass Beads 【后缀自动机】

    题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...

  9. bzoj 2946 [Poi2000]公共串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...

最新文章

  1. 用Python爬一爬那些年你硬盘存过的老师们,太方便啦!
  2. ASP.NET返回上一页面的实现方法
  3. 搜索和搜索形式(SEARCHING and its forms)
  4. 如何处理数据中心电缆管理问题?
  5. Spring boot添加员工页面跳转
  6. mac 用户 文件夹 权限_这可能是 Mac 共享文件最详细的教程了
  7. php 二分查找字符串,php实现的二分查找算法示例
  8. intellij idea 的常用有用快捷键
  9. ai伴侣2.4.7_人工智能:世界各地的活动(7月4日)
  10. [2018.07.31 T3] 第三题
  11. python熊猫烧香_'熊猫烧香'病毒专题:多少变种,怎么破坏,如何查杀?
  12. gps高斯utm_UTM坐标系统与高斯
  13. GStreamer Windows 基辅3:全手动,声像作例,汝作大像也。导演:卡卡,你说老毛子东西啊?应该是 G 公创 Pad 极,1 曰 Video,二曰 Audio
  14. 苹果8a1660是什么版本_苹果7a1660是什么版本
  15. 【Magento】magento 1.7.0.2 paypal支付方式,网站标准支付
  16. Word控件Spire.Doc 【页面背景】教程(1) ;C#/VB.NET:在 Word 中插入水印
  17. 请同学检查地址是否有误:CSDN博客地址汇总(网络121、网络131、计科1111-1114)
  18. 【思维模型】拥抱复杂性(第 1 部分)
  19. test %eax %eax
  20. 从0到1400star,从阮一峰周刊到尤雨溪推荐,小透明开源项目的2021年总结

热门文章

  1. 基于移动端的快递物流信息管理系统Uniapp
  2. Linux命令详解:md5sum
  3. vba 之判断工作表是否处于保护状态:Worksheets.ProtectContents
  4. socket是什么?有什么作用?
  5. Unity 动画系统:Animator
  6. 如何升级npm的版本
  7. Vera平台,为NFT赋予DeFi衍生价值
  8. 大学四年---一个快要毕业学生的反思
  9. cywdhd在RK平台的适配
  10. c语言求矩阵各行元素之和