博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU2222Keywords Search AC_自动机
阅读量:4947 次
发布时间:2019-06-11

本文共 2043 字,大约阅读时间需要 6 分钟。

 

#include 
#include
#include
using namespace std;struct node{ int count; node *next[26],*fail; void Node(){ count = 0;fail = NULL; memset(next,NULL,sizeof(next)); }}arr[300005],*que[500005];char str[1000006];int cnt = 0;void insert(char *str){ node *p = &arr[0]; while( *str ){ int k = *str++ - 'a'; if( !p->next[k] ){ arr[++cnt].Node(); p->next[k] = &arr[cnt]; } p = p->next[k]; } p->count++;}void build_AC(){ node *root = &arr[0],*tmp,*p; int head = 0,tail = 0; for(int i = 0; i < 26; i++){ if(!root->next[i])continue; root->next[i]->fail = root; que[head++] = root->next[i]; } while( head != tail){ tmp = que[tail++]; for(int i = 0; i < 26 ; i++){ if( tmp->next[i] ){ p = tmp->fail; while( p ){ if( p->next[i] ){ tmp->next[i]->fail = p->next[i]; break; } p = p->fail; } if(!p)tmp->next[i]->fail = root; que[head++] = tmp->next[i]; } } }}int query(char *str){ node *root = &arr[0],*p = &arr[0]; int ans= 0; while( *str ){ int k = *str++ - 'a'; while( !p->next[k] && p != root) p = p->fail; p = p->next[k]; p = p ? p : root; node *tmp = p; while( tmp != root && tmp->count != -1){ ans += tmp->count; tmp->count = -1; tmp = tmp->fail; } } return ans;}int main(){ // freopen("in.txt","r",stdin); int t,n; char ch[60]; scanf("%d",&t); while( t-- ){ scanf("%d",&n); arr[cnt = 0].Node(); while( n-- ){ scanf("%s",ch); insert(ch); } build_AC(); scanf("%s",str); printf("%d\n",query(str)); } return 0;}

  

转载于:https://www.cnblogs.com/LUO257316/p/3247147.html

你可能感兴趣的文章
避免内存重叠memmove()性能
查看>>
PHP中的HTTP协议
查看>>
【ASP.NET】从服务器端注册客户端脚本
查看>>
C语言 memcpy二维数组的复制
查看>>
Infix to Postfix Expression
查看>>
win7任务栏还原为xp样式
查看>>
PYTHON_3和2
查看>>
json数组的取值方法
查看>>
2019-7-15 vue01day
查看>>
SELECT LOCK IN SHARE MODE and FOR UPDATE
查看>>
Perl/Nagios – Can’t locate utils.pm in @INC
查看>>
目录导航「深入浅出ASP.NET Core系列」
查看>>
Git常用命令拾遗
查看>>
Canvas的drawImage方法使用
查看>>
自定义适用于手机和平板电脑的 Dynamics 365(四):窗体脚本
查看>>
阴影效果参考网址
查看>>
华为交换机端口镜像
查看>>
简易爬虫(爬取本地数据)
查看>>
一位菜鸟的java 最基础笔记
查看>>
python 进程间通信
查看>>