poj 4052(ac自动机)
题意:自己百度吧!!
分析:就是通过它的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自动机)的更多相关文章
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- POJ 2778 (AC自动机+矩阵乘法)
POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的 ...
- POJ 2896 AC自动机 or 暴力
DESCRIPTION :大意是说.给你n个代表病毒的字符串.m个表示网站的字符串.让你计算有多少个网站被病毒感染了.被那些病毒感染了. 刚开始就想暴力.然而,忽略了条件:每个网站最多有三个病毒.于是 ...
- Censored! POJ - 1625 AC自动机+大数DP
题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...
- Censored! - POJ 1625(ac自动机+简单dp+高精度运算)
题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...
- 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 ...
- poj 2778 AC自动机+矩阵快速幂
题目链接:https://vjudge.net/problem/POJ-2778 题意:输入n和m表示n个病毒,和一个长为m的字符串,里面只可以有'A','C','G','T' 这四个字符,现在问这个 ...
- DNA Sequence POJ - 2778 AC 自动机 矩阵乘法
定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午...... Code: #include<cstdio> #include<algorithm> #include&l ...
- poj 2278 DNASequnce AC自动机
地址:http://poj.org/problem?id=2778 题目: DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total S ...
随机推荐
- POJ 1928
#include <iostream> #include <algorithm> #define MAXN 3000 using namespace std; struct n ...
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
看API文档介绍几个方法: JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock 2.接口Conditio ...
- JavaC 编译目录下所有的UTF-8编码的java文件
javac -encoding UTF-8 *.java
- Git stash方法(转)
命令:git stash1.使用git stash保存当前的工作现场,那么就可以切换到其他分支进行工作,或者在当前分支上完成其他紧急的工作,比如修订一个bug测试提交. 2.如果一个使用了一个git ...
- 套题T1
间隙妖怪(gap.cpp/c/pas) 题目描述: 八云紫是幻想乡的间隙妖怪.她喜欢和八云橙玩一个叫做翻转的游戏.具体规则如下,八云紫对一个长度为N字符串做M次翻转操作,每次操作给定一个X,八云紫将X ...
- 缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例
之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下 ...
- Android学习之-TextView的滑动效果
textView中如何设置滚动条 在xml中定义: <TextView android:layout_width="wrap_content" ...
- python小问题记录:
numpy.chararray.flatten chararray.flatten(order='C') Return a copy of the array collapsed into one d ...
- OpenCV在Android平台上的应用
今年8月份, OpenCV 2.3.1发布了. 虽然从2.2开始, OpenCV就号称支持Android平台, 但真正能让OpenCV在Android上运行起来还是在2.3.1版本上. 在这个版本上, ...
- C#中控件的CheckState和Checked属性区别?
Checked 和CheckState都是检查控件选中状态,都能判断是否选中控件. 只是Checked 通过布尔判断(true & false): CheckState 通过枚举判断. che ...