题意:自己百度吧!!

分析:就是通过它的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. 【设计模式六大原则1】单一职责原则(Single Responsibility Principle)

        http://blog.csdn.net/zhengzhb/article/category/926691/1 图片素材来源,java学习手册 ps.内容为自己整理   定义:不要存在多于一个 ...

  2. hdoj 2202 最大三角形

    题目大意:给定n(3<=n<=50000)个点,求其中任意三个点组成的三角形面积最大,输出该面积. 题目传送:http://acm.hdu.edu.cn/showproblem.php?p ...

  3. [转]ASP.NET Session 详解

    来源:http://www.webshu.net/jiaocheng/programme/ASPNET/200606/1381.html 阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解 ...

  4. 【Apache运维基础(1)】Apache的安装与使用

    安装 yum -y install httpd httpd-devel # 在Ubuntu里面叫做Apache2,输入localhost能打开就算成功了 额...当然专业的运维还是老老实实的去编译吧; ...

  5. Apache与Tomcat整合

    Apache与Tomcat整合   一 Apache与Tomcat比较联系 apache支持静态页,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache ...

  6. 安装xampp后,出现“Apache 2 Test Page powered by CentOS“

    因为是在本地测试,所以没有去考虑为什么会这样,考虑太多的原因.只要能运行就行. 所以网络搜索了一番. 最后,解决办法是: 1, 找到apachectl. 那么就在命令行敲find / -name ap ...

  7. 1、Singleton 单件(创建模式)

    一.Singleton模式主要应用在一些特殊的类,在整个系统运行中,有且仅有一个实例的场景 二.Singleton模式分为单线程与多线程情况,当然多线程一样适应单线程 单线程:在这种情况下比较容易,因 ...

  8. svn:...target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)

    在上传项目到svn时,pom.xml报错

  9. C++:函数模板与模板函数

    6.1 模板的概念 C++允许用同一个函数定义函数,这些函数的参数个数和参数类型不同.例如求最大值的max函数, int max(int x,int y) {       return (x>y ...

  10. PHP开发者常犯的10个MySQL错误

    原文出处: kaiyuanba   欢迎分享原创到伯乐头条 数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初 ...