DESCRIPTION :大意是说。给你n个代表病毒的字符串。m个表示网站的字符串。让你计算有多少个网站被病毒感染了。被那些病毒感染了。

刚开始就想暴力。然而,忽略了条件:每个网站最多有三个病毒。于是。TLE了。于是换AC 自动机。于是MLE了。于是把最大的结构体指针数组换成队列。用时间来换空间。23333

应该注意结构体的初始化是必须的。

附代码:
AC 自动机:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define T_SIZE 10000 struct trie{
trie* nexts[128];
trie* fail;
int num1, num2;
int mem;
trie(){
for(int i=0;i<128;i++){
nexts[i]=NULL;
}
fail=NULL;
num1= num2 = 0;
}
}; char T[T_SIZE+2];
queue<struct trie*>que;
int ans[50];
map<int, int>mm; void insert(trie* root,char* s, int m){
trie* p=root;
for(int i=0;s[i]!='\0';i++){
if(p->nexts[s[i]-0]==NULL)
p->nexts[s[i]-0]=new trie;
p=p->nexts[s[i]-0];
}
p->num1++;
p->mem = m;
} void build_ac_automation(trie* root){
que.push(root);
while(!que.empty()){
trie* fronts=que.front();
que.pop();
for(int i=0;i<128;i++){
if(fronts->nexts[i]!=NULL){
trie* p=fronts->fail;
while(p!=NULL){
if(p->nexts[i]!=NULL){
fronts->nexts[i]->fail=p->nexts[i];
break;
}
p=p->fail;
}
if(p==NULL){
fronts->nexts[i]->fail=root;
}
que.push(fronts->nexts[i]);
}
}
}
} int ac_find(trie* root,char* T){
trie* p=root;
int sum=0;
memset(ans,0,sizeof(ans));
for(int i=0,len=strlen(T);i<len;i++){
while(p->nexts[T[i]-0]==NULL && p!=root)
p=p->fail;
if(p->nexts[T[i]-0]!=NULL){
p=p->nexts[T[i]-0];
}
trie* temp=p;
temp->num2 = temp->num1;
while(temp!=root && temp->num2!=-1){
temp->num2 = temp->num1;
if (!mm[temp->mem])
{ans[sum]=temp->mem+1;
sum+=temp->num2;}
temp->num2=-1;
temp=temp->fail;
}
}
return sum;
} int main(){
int n;
while(scanf("%d",&n)!= EOF){
mm.clear();
int summ=0;
trie* root=new trie;
getchar();
for(int i=0;i<n;i++){
memset(T,0,sizeof(T));
gets(T);
insert(root,T, i);
}
build_ac_automation(root); int t;
scanf("%d",&t);
getchar();
for(int i=0;i<t;i++){
memset(T,0,sizeof(T));
gets(T);
int num=ac_find(root,T);
if(num!=0){
summ++;
printf("web %d:",i+1);
sort(ans, ans+num);
printf(" %d", ans[0]);
for(int j=1;j<num;j++){
if (ans[j] == ans[j-1])
continue;
printf(" %d",ans[j]);
}
printf("\n");
}
}
printf("total: %d\n",summ);
}
return 0;
}

最新文章

  1. [HOOLOO] zizaco/entrust 5.2.x-dev Class name must be a valid object or a string
  2. 【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
  3. 转: EclipseIDE开发 for C++
  4. Android IOS WebRTC 音视频开发总结(四十)-- 国内webrtc现状
  5. 关于Activity的少许细节
  6. PHP添加、更新solr索引
  7. JS-Date日期内置对象
  8. hdu 5823 color II 状压dp
  9. [妙味JS基础]第十二课:数组随机、数组去重
  10. 关于jwplayer 处理进度条禁止快进的处理方法。
  11. Nginx日志配置及配置调试
  12. 基于 libevent 开源框架实现的 web 服务器
  13. ffmpeg 转码命令与ffplay
  14. 深入理解JVM(四)JVM性能监控与故障处理工具
  15. JS中关于正则的巧妙操作
  16. 使用Revel(go)开发网站
  17. PARSER_JS_PRECISION_RANGE_EXCEEDED 错误
  18. Tomcat安装笔记(on Mac)
  19. Java精选笔记_JSTL(JSP标准标签库)
  20. 常用PHP框架收集

热门文章

  1. 20145220韩旭飞《网络对抗》实验九:web安全基础实践
  2. VC++ 实现修改文件创建、访问、修改时间属性(转载)
  3. RS(纠删码)技术浅析及Python实现
  4. 获取Spring项目配置文件元素
  5. [bzoj 1616][Usaco2008 Mar]Cow Travelling游荡的奶牛
  6. 如何在Twitter开发者平台上注册自己的应用
  7. 【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器
  8. 又见链表 --- 另一种Creat方式与反转
  9. FAILED Selenium2Library
  10. spring +servlet 与 spring MVC