题:http://acm.hdu.edu.cn/showproblem.php?pid=2896

分析:ac自动机模板

   注意细节,1、128个ascii码都要;

        2、只要关键码含有只输出一个编号就行

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
#define pb push_back
const int M=*;
const int N=;
int vis[N];
int n;
struct ac{
int tot,root;
int trie[M][],end[M],fail[M];
int newnode(){
for(int i=;i<;i++){
trie[tot][i]=-;
}
end[tot]=;
tot++;
return tot-;
}
void init(){
tot=;
root=newnode();
}
void insert(char *buf,int id){
int now=root,len=strlen(buf);
for(int i=;i<len;i++){
if(trie[now][buf[i]]==-)
trie[now][buf[i]]=newnode();
now=trie[now][buf[i]];
}
end[now]=id;
}
void getfail(){
queue<int>que;
while(!que.empty())
que.pop();
fail[root]=root;
for(int i=;i<;i++)
if(trie[root][i]==-)
trie[root][i]=;
else{
fail[trie[root][i]]=root;
que.push(trie[root][i]);
}
while(!que.empty()){
int now=que.front();
que.pop();
for(int i=;i<;i++){
if(trie[now][i]!=-){
fail[trie[now][i]]=trie[fail[now]][i];
que.push(trie[now][i]);
}
else
trie[now][i]=trie[fail[now]][i];
}
}
}
int query(char *buf){
int len=strlen(buf);
int ans=;
int now=root;
for(int i=;i<len;i++){
now=trie[now][buf[i]];
int tmp=now;
while(tmp!=root){
if(end[tmp]!=){
vis[end[tmp]]=;
ans++;
}
tmp=fail[tmp]; }
}
return ans;
}
}AC;
char s1[],s[];
int main(){
while(~scanf("%d",&n)){
AC.init();
int ans=;
for(int i=;i<=n;i++){
scanf("%s",s);
AC.insert(s,i);
}
AC.getfail();
int m;
scanf("%d",&m);
for(int i=;i<=m;i++){
memset(vis,,sizeof(vis));
scanf("%s",s1);
if(AC.query(s1)>=){
printf("web %d:",i);
for(int j=;j<=n;j++)
if(vis[j])
printf(" %d",j);
printf("\n");
ans++;
}
}
printf("total: %d\n",ans);
}
return ;
}

题:http://acm.hdu.edu.cn/showproblem.php?pid=3065

分析:只要将上题的vis改为技术数组即可

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
#define pb push_back
const int M=*;
const int N=;
char s[N][],s1[];
int n;
struct ac{
int tot,root;
int trie[M][],end[M],fail[M],vis[M];
int newnode(){
for(int i=;i<;i++){
trie[tot][i]=-;
}
end[tot++]=;
return tot-;
}
void init(){
tot=;
root=newnode();
}
void insert(char *buf,int id){
int len=strlen(buf);
int now=root;
for(int i=;i<len;i++){
if(trie[now][buf[i]]==-)
trie[now][buf[i]]=newnode();
now=trie[now][buf[i]];
}
end[now]=id;
}
void getfail(){
queue<int>que;
while(!que.empty()){
que.pop();
}
fail[root]=root;
for(int i=;i<;i++){
if(trie[root][i]==-)
trie[root][i]=root;
else{
fail[trie[root][i]]=root;
que.push(trie[root][i]);
}
}
while(!que.empty()){
int now=que.front();
que.pop();
for(int i=;i<;i++){
if(trie[now][i]!=-){
fail[trie[now][i]]=trie[fail[now]][i];
que.push(trie[now][i]);
}
else
trie[now][i]=trie[fail[now]][i];
}
}
}
void query(char *buf){
memset(vis,,sizeof(vis));
int len=strlen(buf);
int now=root;
for(int i=;i<len;i++){
now=trie[now][buf[i]];
int tmp=now;
while(tmp!=root){
if(end[tmp]!=)
vis[end[tmp]]++;
tmp=fail[tmp];
}
}
for(int i=;i<=n;i++)
if(vis[i]>)
printf("%s: %d\n",s[i],vis[i]);
}
}AC;
int main(){
while(scanf("%d",&n)==){
AC.init();
for(int i=;i<=n;i++){
scanf("%s",s[i]);
AC.insert(s[i],i);
}
AC.getfail(); scanf("%s",s1);
AC.query(s1);
}
return ;
}

hdu2896&&3065的更多相关文章

  1. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  4. AC自动机 - 多模式串的匹配运用 --- HDU 3065

    病毒侵袭持续中 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=3065 Mean: 略 analyse: AC自动机的运用. 这一题 ...

  5. Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG]

    Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG] <ignore_js_op> 程序员文本编辑器 Sublime Tex ...

  6. HDU 3065 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...

  7. HDU 3065 病毒侵袭持续中

    HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. How to Cracked Sublime Text 3 Build 3065 in Ubuntu (Linux)

    整理自How to Cracked Sublime Text 3 Build 3065 in Ubuntu (Linux) Sublime Text 3 Build 3065 Release Date ...

  9. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

随机推荐

  1. Mac Go 环境变量配置

    GOPATH 是工作目录,就是你打代码,代码的存放目录 GOROOT 是Go的安装目录,我下载的是免安装版的 现在的Go环境变量就是设置成这个样子, 终于Bee不会报错了!!!

  2. 《新标准C++程序设计》1.7-1.10(C++学习笔记2)

    1.内联函数(inline关键字) eg.inline int Max(int a,int b) { if(a>b) return a; return b; } 当编译器处理调用内联函数的语句时 ...

  3. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  4. 启动mysql遇到问题Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    在mysql的启动过程中有时会遇到下述错误 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 请问mys ...

  5. 连接mysql的各种方式

    mysql连接操作是客户端进程与mysql数据库实例进程进行通信.从程序设计角度来说,属于进程通信,常用进程通信包括: 管道.Tcp/Ip 套接字.UNIX域套接字. 1.TCP/IP (1)使用最多 ...

  6. phpmyadmin拿网站shell

    开门见山 1. 找到一个赌博网站,发现存在php探针界面,在下面输入密码尝试用弱口令进行连接,尝试是否成功 失败的结果是这样. 2. 成功! 3. 连接成功的,点击phpMyAdmin管理,进行弱口令 ...

  7. ZOJ-1234 UVA-10271 DP

    最近觉得动态规划真的很练脑子,对建模以及思维方法有很大帮助,线段树被卡到有点起不来的感觉 最近仔细思考了一下动态规划的思想,无非是由局部最优解得到全局最优解,由此类推,发现,像最短路和最小生成树其实都 ...

  8. DevOps专题 |监控,可观测性与数据存储

    对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计.今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系 ...

  9. 干货 | 把Flutter扩展到微信小程序端的探索

    Google Flutter是一个非常优秀的跨端框架,不仅可以运行在Android. iOS平台,而且可以支持Web和桌面应用.在国内小程序是非常重要的技术平台,我们也一直思考能否把Flutter扩展 ...

  10. (4)关于Alpha通道问题

    其实,我还是不理解,我还是先把我目前懂得和觉得有用的东西先存下来 =================================================================== ...