hdu4416[多串后缀自动机]
题目链接: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[多串后缀自动机]相关推荐
- HDU - 4416 Good Article Good sentence(广义后缀自动机/后缀自动机)
题目链接:点击查看 题目大意:给出一个字符串 s ,再给出 n 个字符串 t ,现在问字符串 s 中有多少个不同的子串满足不是 t1 ~ tn 中任意一个字符串的子串 题目分析:第一次接触这样的题目, ...
- hdu4416 Good Article Good sentence(多个串的本质不同的串个数,后缀自动机)
题意: 给定串S,和若干个串T(i), 问有多少个S的本质不同的子串,在所有T(i)中没有出现过 数据范围:|S|<=1e5,,sum(|T|)<=1e5 解法: 将所有T串插入后缀自动机 ...
- [hdu4416 Good Article Good sentence]后缀自动机SAM
题意:给出串A和串集合B={B1,B2,...,Bn},求串A的所有不同子串中不是B中任一串的子串的数目. 思路:把A和B中所有字符串依次拼接在一起,然后构造后缀自动机,计算每个状态的R集合元素的最大 ...
- CodeForces - 427D Match Catch(后缀数组/广义后缀自动机)
题目链接:点击查看 题目大意:给出两个字符串,求出两个字符串中的最短公共子串,且在每个字符串中只出现过一次 题目分析:因为这个公共子串只能在字符串中出现一次,考虑到用后缀数组,我们先将两个字符串通过特 ...
- 【BZOJ3926】【Zjoi2015】诸神眷顾的幻想乡 广义后缀自动机
链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...
- bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1009 Solved: 596 [ Subm ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做...
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. 1 #include <cstdlib> 2 ...
- 【POJ1509】Glass Beads 【后缀自动机】
题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
最新文章
- 用Python爬一爬那些年你硬盘存过的老师们,太方便啦!
- ASP.NET返回上一页面的实现方法
- 搜索和搜索形式(SEARCHING and its forms)
- 如何处理数据中心电缆管理问题?
- Spring boot添加员工页面跳转
- mac 用户 文件夹 权限_这可能是 Mac 共享文件最详细的教程了
- php 二分查找字符串,php实现的二分查找算法示例
- intellij idea 的常用有用快捷键
- ai伴侣2.4.7_人工智能:世界各地的活动(7月4日)
- [2018.07.31 T3] 第三题
- python熊猫烧香_'熊猫烧香'病毒专题:多少变种,怎么破坏,如何查杀?
- gps高斯utm_UTM坐标系统与高斯
- GStreamer Windows 基辅3:全手动,声像作例,汝作大像也。导演:卡卡,你说老毛子东西啊?应该是 G 公创 Pad 极,1 曰 Video,二曰 Audio
- 苹果8a1660是什么版本_苹果7a1660是什么版本
- 【Magento】magento 1.7.0.2 paypal支付方式,网站标准支付
- Word控件Spire.Doc 【页面背景】教程(1) ;C#/VB.NET:在 Word 中插入水印
- 请同学检查地址是否有误:CSDN博客地址汇总(网络121、网络131、计科1111-1114)
- 【思维模型】拥抱复杂性(第 1 部分)
- test %eax %eax
- 从0到1400star,从阮一峰周刊到尤雨溪推荐,小透明开源项目的2021年总结