HDUnbsp;2222nbsp;nbsp;Keywordsnbsp;Search(AC自…

2023-10-20 03:38

本文主要是介绍HDUnbsp;2222nbsp;nbsp;Keywordsnbsp;Search(AC自…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222

 

分析见大牛:http://www.cppblog.com/mythit/archive/2009/07/30/80633.html

 

模版见大神:http://archive.cnblogs.com/a/2206679/

这个模版貌似废话比较多,其实可以更简略的~ ~ ~

 

附上自己的代码:

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 500008

typedef struct point{
   int count;
   struct point *next[26],*fail;
}*Tree,Node;
Tree root;

char str[1000008];
Tree Q[500008];

Tree NEW()
{
   int i;
   Tree p;
   p=(Tree)malloc(sizeof(Node));
   for(i=0;i<26;i++)
       p->next[i]=NULL;
   p->count=0;
   p->fail=NULL;
   return p;
}

void Build(char ss[])
{
   int i=0;
   Tree p,s;
   p=root;
   while(ss[i])
   {
       if(p->next[ss[i]-'a']==NULL)
       {
           s=NEW();
           p->next[ss[i]-'a']=s;
           p=s;
       }
       else p=p->next[ss[i]-'a'];
       i++;
   }
   p->count++;
}

void AC_Automation()
{
   int i,front,rear;
   Tree temp,p;
   front=rear=0;
   Q[front++]=root;
   while(rear<front)
   {
       temp=Q[rear];
       rear++;
       for(i=0;i<26;i++)
       {
           if(temp->next[i]==NULL)continue;
           if(temp==root)
               temp->next[i]->fail=root;
           else
           {
               p=temp->fail;
               while(p!=NULL)
               {
                   if(p->next[i]!=NULL)
                   {
                       temp->next[i]->fail=p->next[i];
                       break;
                   }
                   p=p->fail;
               }
               if(p==NULL)temp->next[i]->fail=root;
           }
           Q[front++]=temp->next[i];
       }
   }
}

int search()
{
   int i=0,sum=0;
   Tree p=root,temp;
   while(str[i])
   {
       while(p->next[str[i]-'a']==NULL && p!=root)
           p=p->fail;
       p=p->next[str[i]-'a'];
       if(p==NULL)
           p=root;
       temp=p;
       while(temp!=root && temp->count!=-1)
       {
           sum+=temp->count;
           temp->count=-1;
           temp=temp->fail;
       }
       i++;
   }
   return sum;
}

int main()
{
   int n,i,ans;
   char trie[55];
   scanf("%d",&ans);
   while(ans--)
   {
       root=NEW();
       scanf("%d",&n);
       for(i=0;i<n;i++)
       {
           scanf("%s",trie);
           Build(trie);
       }
       AC_Automation();
       scanf("%s",str);
       printf("%d\n",search());
   }
   return 0;
}

这篇关于HDUnbsp;2222nbsp;nbsp;Keywordsnbsp;Search(AC自…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244388

相关文章

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

HDU 3037 今年暑假不AC

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2037 题解: 对结束时间排序,然后进行一次遍历,寻找开始时间不小于上一个结束时间的节目。 代码: #include<stdio.h>#include<iostream>using namespace std;struct program{int start,end;}p[101

广度优先搜索Breadth-First-Search

目录  1.问题 2.算法 3.代码 4.参考文献  1.问题         广度优先搜索,稍微学过算法的人都知道,网上也一大堆资料,这里就不做过多介绍了。直接看问题,还是从下图招到一条从城市Arad到Bucharest的路径。  该图是连通图,所以必然存在一条路径,只是如何找到最短路径。 2.算法 还是贴一个算法的伪代码吧: 1 procedu

基于 AC 驱动的电容结构 GaN LED 模型开发和应用

随着芯片尺寸减小,微小尺寸GaN 基 Micro LED 显示面临着显示与驱动高密度集成的难题,传统直流(DC)驱动技术会导致结温上升,降低器件寿命。南京大学团队创新提出交流(AC)驱动的单电极 LED(SC-LED)结构【见图1】,利用隧穿结(TJ)降低器件的交流工作电压。为了深入理解该器件的工作原理,我司技术团队开发了基于 AC 驱动的物理解析模型,揭示了隧穿结降低器件工作电压的

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。