hdu 2222(AC自动机)

 参考:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html
1
/* 2 * AC自动机 3 */ 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <iostream> 8 9 using namespace std; 10 11 const int N = 51; 12 const int L = 500001; 13 const int M = 1000001; 14 15 char pat[N], str[M]; 16 struct node {//节点数据 17 int c; 18 node *prefix; 19 node *child[26]; 20 node() { 21 c = 0; 22 prefix = NULL; 23 for (int i=0; i<26; ++i) child[i] = NULL; 24 } 25 }*root, *Q[L]; 26 int front, rear; 27 28 void insert(node *root, char pat[]) {//建立字典树 29 node *p = root; 30 for (int k,i=0; pat[i]; ++i, p=p->child[k]) { 31 k = pat[i] - 'a'; 32 if (!p->child[k]) p->child[k] = new node(); 33 } 34 ++p->c; 35 } 36 37 void buildAc(node *root) {//建立自动机 38 node *p, *q; 39 root->prefix = NULL; 40 front = rear = 0; 41 Q[front++] = root; 42 while (rear < front) { 43 p = Q[rear++]; 44 for (int i=0; i<26; ++i) { 45 if (p->child[i]) { 46 if (p == root) p->child[i]->prefix = root; 47 else { 48 q = p->prefix; 49 while (q!=root && !q->child[i]) q = q->prefix; 50 if (q->child[i]) p->child[i]->prefix = q->child[i]; 51 else p->child[i]->prefix = root; 52 } 53 Q[front++] = p->child[i]; 54 } 55 } 56 } 57 } 58 59 int match(node *root, char str[]) {//匹配 60 node *p = root; 61 int cnt = 0; 62 for (int k,i=0; str[i]; ++i) { 63 k = str[i] - 'a'; 64 while (!p->child[k] && p!=root) p = p->prefix; 65 p = p->child[k]; 66 if (p==NULL) p = root; 67 node *tmp = p; 68 while (tmp!=root && tmp->c) { 69 cnt += tmp->c; 70 tmp->c = 0; 71 tmp = tmp->prefix; 72 } 73 } 74 return cnt; 75 } 76 77 int main() { 78 int t; 79 scanf ("%d", &t); 80 while (t--) { 81 int n; 82 scanf ("%d", &n); 83 root = new node(); 84 while (n--) scanf ("%s", pat), insert(root, pat); 85 scanf ("%s", str); 86 buildAc(root); 87 printf ("%d\n", match(root, str)); 88 } 89 return 0; 90 }

 

转载于:https://www.cnblogs.com/try86/archive/2012/05/09/2491569.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值