HDU-3065 病毒侵袭持续中 AC自动机又是一板子!
病毒侵袭持续中
上一题是求出现多少病毒输出病毒序号,而这题输出每个病毒出现的次数。这题有字典树基础都能做出来,把叶子节点用相应的编号标记起来,匹配的时候遍历到叶子节点用一个数组把次数存起来就行了。
有了前几题的教训直接用静态树做用C++交,果然不会错!
const int N=129;
char str[2000001],s[1001][55],v[1001];
int head,tail,cnt;
struct tree
{
int f;
tree *fail;
tree *next[N];
}*q[50001],*root,memory[50001];
void insert(int i,char *s)
{
tree *p=root;
while(*s!='\0')
{
int id=(int)(*s);
if(p->next[id]==NULL) p->next[id]=&memory[cnt++];
p=p->next[id];
s++;
}
p->f=i;
}
void build()
{
root->fail=NULL;
q[head++]=root;
while(head!=tail)
{
tree *temp=q[tail++];
tree *p=NULL;
for(int i=0; i<N; i++)
if(temp->next[i])
{
if(temp==root) temp->next[i]->fail=root;
else
{
p=temp->fail;
while(p!=NULL)
{
if(p->next[i])
{
temp->next[i]->fail=p->next[i];
break;
}
p=p->fail;
}
if(p==NULL) temp->next[i]->fail=root;
}
q[head++]=temp->next[i];
}
}
}
void find(char *s)
{
tree *p=root;
int ans=0;
while(*s!='\0')
{
int id=(int)(*s);
while(p->next[id]==NULL&&p!=root) p=p->fail;
p=p->next[id];
p=p==NULL?root:p;
tree *temp=p;
while(temp!=root)
{
if(temp->f) v[temp->f]++;
temp=temp->fail;
}
s++;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(memory,0,sizeof(memory));
memset(v,0,sizeof(v));
cnt=head=tail=0;
root=&memory[cnt++];
for(int i=1; i<=n; i++)
{
scanf("%s",s[i]);
insert(i,s[i]);
}
build();
scanf("%s",str);
find(str);
for(int i=1; i<=n; i++)
if(v[i]) printf("%s: %d\n",s[i],v[i]);
}
return 0;
}
HDU-3065 病毒侵袭持续中 AC自动机又是一板子!的更多相关文章
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- hdoj 3065 病毒侵袭持续中(AC自动机)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...
- HDU 3065 病毒侵袭持续中
HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3065 病毒侵袭持续中【AC自动机】
<题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是 ...
- HDU 3065 病毒侵袭持续中(AC自己主动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- hdu----(3065)病毒侵袭持续中(AC自动机)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 3065病毒侵袭持续中
病毒侵袭持续中 http://acm.hdu.edu.cn/showproblem.php?pid=3065 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 3065 病毒侵袭持续中 (模板题)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- JS实现的图片预览功能
之前的博文有实现过图片上传预览,但那种方法是预览时就将图片上传,会产生很大的浪费空间.找到了之前有人写的用JS实现的图片预览,就说用js将上传的图片显示,上传代码在之前的博文中有写到. 以下是实现的代 ...
- PaaS优点与限制(3)
PaaS优点与限制(3) PaaS学习笔记目录 PaaS基础学习(1) 在PaaS上开发Web.移动应用(2) PaaS优点与限制(3) 13. PaaS的核心服务 核心服务是指提供数据存储.SQl. ...
- java.lang.ClassCastException android.widget.RelativeLayout LayoutParams 异常
1.在xml布局文件如下所示: <RelativeLayout android:layout_width="match_parent" android:layout_heig ...
- windows Git的安装和使用
一.本人是根据廖雪峰大神的个人官网学习的git,并有感而发以做笔记的方式写下这篇博客,希望可以帮助到自己和其他人,廖雪峰个人官网http://www.liaoxuefeng.com/ 二.声明我的电脑 ...
- 如何计算支撑向量数(SVs)
申明:转载请注明出处. 支持向量机(SVM)是一个成熟的单分类器,常常用于对比实验中.往往需要统计支持向量数量来比较算法优劣,MATLAB有自带的SVM工具箱,用法如下: [train, test] ...
- WebStorm 配置less
1.打开Webstorm的Setting 搜索,watch 找到 File watch,点击右侧加号添加Less. 2.配置, working directory. Output paths
- myeclipse报错MA
以下问题萌新问了我很多次了,无奈写个随笔.之后问的我都在这个随笔里补充. 断电/自动关机导致的问题: Could not open the editor: the file does not exis ...
- iOS5 and iOS6都只支持横屏的方法
If your app uses a UINavigationController, then you should subclass it and set the class in IB. You ...
- 创建一个文件夹用于写入UTF-8编码的文件
实现效果: 知识运用: File类的CreateText方法 StreamWriter类的WriteLine方法 实现代码: private void button2_Click(object sen ...
- Bootstrap 网格系统(Grid System)实例1
Bootstrap 网格系统(Grid System)实例:堆叠水平 <!DOCTYPE html><html><head><meta http-equiv= ...