HDU 2222 Keywords Search(AC自动机)

本文介绍AC自动机的基本概念及其在模式匹配中的应用。通过构建Trie树和设置失败指针来实现高效的字符串搜索,特别适合处理大量关键词的情况。文中还提供了一个具体的C语言实现案例。

AC自动机,这个名字有没点虎。乍一看有没有自动AC题目的意思,就是万精油模板,其实是一个匹配算法。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。

#include<stdio.h>
#include<string.h>
#define MAXD 500010
#define MAXT 1000010
char b[60], txt[MAXT];
int N, next[MAXD][26], flag[MAXD], P[MAXD], q[MAXD], e, cnt;
void insert(int cur, int k)
{    
	++ e;
    flag[e] = 0;
    memset(next[e], 0, sizeof(next[e]));
    next[cur][k] = e;
}
void update()
{    
	int i, j, u, x, front, rear; 
	front = rear = 0;
    P[0] = q[rear ++] = 0; 
	while(front < rear)  
	{     
		u = q[front ++]; 
		for(i = 0; i < 26; i ++)
            if(next[u][i]) 
			{           
				x = next[u][i]; 
				if(u == 0)  
					P[x] = 0;  
				else    
				{   
					for(j = P[u]; j != 0; j = P[j])
                        if(next[j][i])  
						{    
							P[x] = next[j][i];   
							break;    
						}    
						if(j == 0)    
							P[x] = next[0][i]; 
				}      
				q[rear ++] = next[u][i];  
			}  
	}
}
int main()
{  
	int t;  
	scanf("%d", &t); 
	while(t --)  
	{     
		int i, j, k, cur;
		scanf("%d", &N);
		e = 0;    
		memset(next[e], 0, sizeof(next[e]));
		for(i = 0; i < N; i ++)
		{        
			scanf("%s", b);
			cur = 0;   
			for(j = 0; b[j]; j ++)
			{           
				k = b[j] - 'a'; 
				if(!next[cur][k])
					insert(cur, k);
				cur = next[cur][k]; 
			}       
			++ flag[cur];
		}
		int t; 
		update();  
		scanf("%s", txt);
		j = cnt = 0; 
		for(i = 0; txt[i]; i ++) 
		{     
			k = txt[i] - 'a';
			while(j > 0 && !next[j][k])  
				j = P[j];  
			j = next[j][k];     
			for(t = j; t > 0; t = P[t]) 
			{         
				if(flag[t] >= 0)   
				{           
					cnt += flag[t];       
					flag[t] = -1;  
				}           
				else         
					break;  
			}  
		}  
		printf("%d\n", cnt);
    }   
	return 0;
}

 

全名:Aho-Corasick automation。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。难度很大,KMP和Trie都是我不怎么熟悉的地域,某一论文(全英文)很好的阐述了这个算法,不过就是英文难看了,我也没去看,就着网上其他人的文章看了看。

顺便给个地址:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html

感觉这位同学写的不错了。

这题是入门的一个模板题,需要注意的是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为1的操作变为自加1的操作。

转载于:https://www.cnblogs.com/littlex/archive/2012/02/06/2340688.html

【源码免费下载链接】:https://renmaiwang.cn/s/z3ywc 在现代网络应用中,用户通常会遇到通过鼠标滚轮控制页面元素缩放的需求,这常见于图片浏览器、地图服务等应用中。本文将详细讲解如何利用JavaScript实现这一功能,重点介绍滚轮事件处理机制以及通过DOM操作调整图像尺寸的技术。在此过程中,我们将深入理解滚轮事件的本质:这是一个滚动事件,在用户操作鼠标滚轮时会触发。需要注意的是,该事件最早由旧版IE浏览器引入,并在标准的DOM事件中推荐使用wheel事件来绑定滚轮行为。然而,为了确保兼容性,许多应用仍然保留使用onmousewheel事件的习惯做法。以上代码示例展示了如何定义一个JavaScript函数bbimg来控制缩放效果。该函数接受当前元素作为参数,并通过获取其缩放值和分析滚动方向来实现缩放操作。具体来说,在每次滚轮动作后,我们计算出相应的缩放步进并更新当前尺寸;若缩放值超出合理范围则不做调整以防止图像过小或过大。在HTML环境中,我们可以通过onmousewheel属性将bbimg函数绑定到目标元素上,实现用户交互。通过这种方式,页面可以响应用户的滚动操作以实时调整图片大小。值得注意的是,在IE浏览器中该功能依赖于图片的zoom属性,而其他主流浏览器则支持transform缩放机制提供更为平滑的效果。为了在多设备环境下保持一致效果,我们建议结合CSS transform属性与JavaScript缩放计算来实现统一控制。此外,考虑到不同浏览器对事件绑定的不同兼容性要求,在必要时可引入jQuery等库来辅助处理事件和样式更新。总体而言,通过JavaScript完成鼠标滚轮缩放功能涉及 DOM 事件处理、DOM 操作以及动态样式调整等多个方面技术。这一内容在交互式网页开发中具有重要价值与广泛应用。希望本文能帮助读者深入理解并掌握相关实现细节,并在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值