题意:自己百度吧!!

分析:就是通过它的fail指针来找出它的子串就行了,这题其实不难的。这好像还是金华邀请赛的题哦!

代码实现:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<queue>
using namespace std;
struct node{
int next[];
int fail;
int num;
void init()
{
memset(next,,sizeof(next));
fail=;
num=;
}
}a[];
char keyword[][];
char S[],temp[];
int visited[];
int tot,n;
int ok[]; void chushihua()//初始化
{
tot=;
a[].init();
memset(visited,,sizeof(visited));
} void insert(char *str,int biaohao)//建立字典树
{
int index,p=;
for(;*str!='\0';str++)
{
index=*str-'A';
if(a[p].next[index]==)
{
a[++tot].init();
a[p].next[index]=tot;
}
p=a[p].next[index];
}
a[p].num=biaohao;
} void build_fail()//建立trie图
{
queue<int>Q;
int p,cur,son,i;
Q.push();
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(i=;i<;i++)
{
if(a[p].next[i]!=)
{
son=a[p].next[i];
cur=a[p].fail;
if(p==)
a[son].fail=;
else
{
while(cur&&a[cur].next[i]==)
cur=a[cur].fail;
a[son].fail=a[cur].next[i];
}
Q.push(son);
}
else
a[p].next[i]=a[a[p].fail].next[i];
}
}
} void change(char str[])
{
int i,len=,k=;
for(i=;str[i]!='\0';i++)
{
if(str[i]>='A'&&str[i]<='Z')
temp[len++]=str[i];
else
{
i++;
k=;//开始的时候这里没加,一直wa,细节啊
k=k+str[i]-'';
i++;
while(str[i]>=''&&str[i]<='')
{
k=k*+str[i]-'';
i++;
}
while(k--)
temp[len++]=str[i];
i++; }
}
temp[len]='\0';
strcpy(str,temp);
} void solve1()//在主串里出现过的全部标记了
{
int i,index,p=,j;
for(i=;S[i]!='\0';i++)
{
index=S[i]-'A';
p=a[p].next[index];
if(a[p].num)
{
visited[a[p].num]=;
continue;//它的子串肯定就不用标记了
}
for(j=p;j!=&&ok[j]==;j=a[j].fail)
{
ok[j]=;
visited[a[j].num]=;
}
}
} void solve2(char S[],int biaohao)//去掉子串
{
int i,index,p=,j;
for(i=;S[i]!='\0';i++)
{
index=S[i]-'A';
p=a[p].next[index];
for(j=p;j!=&&ok[j]==;j=a[j].fail)
{
if(a[j].num&&a[j].num!=biaohao)
{
visited[a[j].num]=;
ok[j]=;
}
}
}
} int main()
{
int T,i,res;
scanf("%d",&T);
while(T--)
{
chushihua();
res=;
scanf("%d",&n);
getchar();
for(i=;i<=n;i++)
{
scanf("%s",keyword[i]);
change(keyword[i]);//把畸形的字符串变成正常的
insert(keyword[i],i);
}
build_fail();
scanf("%s",S);
change(S);
memset(ok,,sizeof(ok));
solve1();
memset(ok,,sizeof(ok));
for(i=;i<=n;i++)
if(visited[i]==)
solve2(keyword[i],i);
for(i=;i<=n;i++)
if(visited[i]==)
res++;
printf("%d\n",res);
}
return ;
}

poj 4052(ac自动机)的更多相关文章

  1. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  2. POJ 2778 (AC自动机+矩阵乘法)

    POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的 ...

  3. POJ 2896 AC自动机 or 暴力

    DESCRIPTION :大意是说.给你n个代表病毒的字符串.m个表示网站的字符串.让你计算有多少个网站被病毒感染了.被那些病毒感染了. 刚开始就想暴力.然而,忽略了条件:每个网站最多有三个病毒.于是 ...

  4. Censored! POJ - 1625 AC自动机+大数DP

    题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...

  5. Censored! - POJ 1625(ac自动机+简单dp+高精度运算)

    题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...

  6. DNA Sequence POJ - 2778 AC自动机 && 矩阵快速幂

    It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to ...

  7. poj 2778 AC自动机+矩阵快速幂

    题目链接:https://vjudge.net/problem/POJ-2778 题意:输入n和m表示n个病毒,和一个长为m的字符串,里面只可以有'A','C','G','T' 这四个字符,现在问这个 ...

  8. DNA Sequence POJ - 2778 AC 自动机 矩阵乘法

    定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午...... Code: #include<cstdio> #include<algorithm> #include&l ...

  9. poj 2278 DNASequnce AC自动机

    地址:http://poj.org/problem?id=2778 题目: DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total S ...

随机推荐

  1. Struts2从版本2.2.1升级至2.3.15.1出现的问题

    问题一 原版本Struts2.2.1中的JSP代码如下: <a class="buttonSelect" href="/manage/machine/uploadF ...

  2. 【转】12 款优秀的 JavaScript MVC 框架评估

    JavaScript MVC 框架有很多,不同框架适合于不同项目需求.了解各种框架的性能及优劣有利于我们更加快捷的开发.作者(Gordon L.Hempton)一直在寻求哪种MVC框架最为完美,他将目 ...

  3. Asp.net 上传图片添加半透明图片或者文字水印的方法

    主要用到System.Drawing 命名空间下的相关类,如Brush.Image.Bitmap.Graphics等等类 Image类可以从图片文件创建Image的实例,Bitmap可以从文件也可以从 ...

  4. C# MessageBox 用法大全(转)

    C# MessageBox 用法大全 http://www.cnblogs.com/Tammie/archive/2011/08/05/2128623.html 我们在程序中经常会用到MessageB ...

  5. hdu1116

    http://acm.hdu.edu.cn/showproblem.php?pid=1116 #include<stdio.h> #include<math.h> #inclu ...

  6. 读书笔记:7个示例科普CPU Cache

    本文转自陈皓老师的个人博客酷壳:http://coolshell.cn/articles/10249.html 7个示例科普CPU Cache (感谢网友 @我的上铺叫路遥 翻译投稿) CPU cac ...

  7. ORA-12560: TNS: 协议适配器错误 解决

    传统方法: 大多数网站都有记载三个方法解决 但是出现上述错误另一个原因: 刚刚安装的Oracle 里面的账户都是锁定的 需要解锁 见如下的Oracle11g安装过程 http://www.2cto.c ...

  8. 再谈PCA

        其实之前写过PCA相关的博文,但是由于之前掌握的理论知识有限,所以理解也比较浅.这篇博文,我们以另外一种角度来理解PCA看,这里我假设大家对PCA都有一个初步的了解.首先,我们举一个二维空间中 ...

  9. TCL语言笔记:TCL基础语法

    一.什么是TCL Tcl 全称是 Tool command Language.它是一个基于字符串的命令语言,基础结构和语法非常简单,易于学习和掌握. Tcl 语言是一个解释性语言,所谓解释性是指不象其 ...

  10. Dubbo分布式服务框架入门

    参考http://blog.csdn.net/u013142781/article/details/50387583 一.Dubbo概念介绍 1.1.Dubbo是什么? Dubbo是一个分布式服务框架 ...