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 ...
随机推荐
- [转载]Java学习这七年
从2005那会做自动化测试开始接触Java开始,至今近7年.今天正好项目结束,趁机整理下思路,确定后续方向. 前三个年头基本上集中于Java基础的学习,包括设计模式,从完全不懂,到看的懂但似乎又不懂, ...
- 为什么Android 3.0如此罕见?
3.0(2011年2月)代号蜂巢,专用于android系统的平板电脑,不用于手机.4.0(2011年5月公布)的开发就是让平板电脑和手机能够共用一个版本的系统.4.0通用于平板电脑和手机.
- cojs 安科赛斯特 题解报告
QAQ 从IOI搬了一道题目过来 官方题解貌似理论上没有我的做法优,我交到BZOJ上也跑的飞快 结果自己造了个数据把自己卡成了4s多,真是忧桑的故事 不过貌似原题是交互题,并不能离线 说说我的做法吧 ...
- cojs 疯狂的魔法树 疯狂的颜色序列 题解报告
疯狂的魔法树 一个各种操作大杂烩的鬼畜数据结构题目 首先我们注意到树的形态是半随机的 我们可以树分块,对树分成若干个块 对于每个块我们维护一个add标记表示增量 维护一个vis标记表示覆盖量 注意标记 ...
- [iOS]开发者证书和描述文件的作用
先说下证书吧. 然后是描述文件
- AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
代码地址:https://github.com/Luction/AndroidRichText AndroidRichText帮助实现像QQ,微信一样的,一个TextView里既有文字又有表情又有图片 ...
- servlet request.getParamter 有时获取参数为null
他妈的,参数有时可以获取,有时又不行,折腾了好久,把tomcat换成8.0的,之前用apache-tomcat-7.0.67
- powerdesigner连接数据库 导出数据 生成PDM文件 傻瓜试教程
也可下载文档:http://download.csdn.net/detail/shutingwang/6378665
- xmlsechema验证
//创建xmlDocument XmlDocument doc = new XmlDocument(); ...
- Eclipse中Python插件PyDev的安装与配置流程
安装PyDev插件的两种安装方法: 方法1.下载地址:http://sourceforge.net/projects/pydev/files/,将下载的PyDev解压(目前最新版本 PyDev 4.5 ...