题意:自己百度吧!!

分析:就是通过它的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. ZOJ 2724 Windows Message Queue (优先级队列,水题,自己动手写了个最小堆)

    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...

  2. Struts2 SSH整合框架返回json时,要注意懒加载问题

    返回的这个json对象,要保证它里面的所有属性都已经取出来了(即不是proxy或者是懒加载),否则当struts框架将该对象转化成json数据时,会报出一个no session的错误. 因此你要将该懒 ...

  3. [转]C++四种cast操作符

    http://blog.csdn.net/starryheavens/article/details/4617637 C 风格(C-style)强制转型如下: (T) expression 或 T(e ...

  4. window下安装composer and yii2

    我的环境是集合包xampp 1,下载composer:下载地址https://getcomposer.org/download/, 点击蓝色字体“Composer-Setup.exe” 2,安装com ...

  5. CSDN代码片排版

    CSDN上发博文,尤其是有代码的,要用好“插入代码”功能(见下图).这是必须的,未来的IT程序员,需要用这种方式,展示出自己的代码.这是尊重读者,树立品牌的需要. 相关方法,参考见视频<发布第一 ...

  6. 删除元素 不存在 NO 存在 输出余下元素

    #include<stdio.h> #include<stdlib.h> #define N 5 #define NULL 0 #define OK 1 #define ERR ...

  7. QTimer源码分析(以Windows下实现为例)

    QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...

  8. objectC时间用法

    #define kDEFAULT_DATE_TIME_FORMAT (@"yyyy-MM-dd HH:mm:ss") //获取当前日期,时间+(NSDate *)getCurren ...

  9. Toad创建DBLINKsop

    Toad创建DBLINKsop 1.创建服务: 点击“测试”,出现如下测试窗口后点击更改登录,用户名和密码数据目标主机用户名.密码; 出现如下窗口后,点击“关闭”,然后点击“完成”即可; 2.创建db ...

  10. hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)

    题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...