zoj 3228 Searching the String(AC自动机基本应用)

题意:给你一个文本串,再给你若干个单词(模板),分为两种,一种是可重复的,另一种是不可能重复的,问你每个单词(模板)在文本中可以找到多少个。

思路:AC自动机基本应用。建立AC自动机,val[u]=1表示该节点为单词尾字母节点,即包含了该单词。至于两种情况,例如文本串为ababa,对于单词aba,若不可重复,则只能找到1个,如果可重复,则可以找到2个。重复的状况就不需要再处理,但是不重复的状态需要再加两个数组,pre数组表示此单词在文本串中上一次出现的位置,len数组记录该单词的长度,对于不能重复的单词,在文本中每找到一个该单词,就判断pre[i]+len[i]是否<=pos(pos为本次找到该单词的位置)。用sum[mx][2],分别表示该单词重复或者不重复情况下在文本中能找到多少个。

ps:模板各种写错。。。还需要多加练习。。。很多细节还需要自己体会。。。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int mx=610000;
const int ssize=26;
struct ACzdj{
    int ch[mx][ssize];
    int val[mx];
    int f[mx],last[mx];
    int pre[mx],len[mx];
    int sum[mx][2];
    int sz;
    void init()
    {
     memset(ch[0],0,sizeof(ch[0]));
     val[0]=0;
     f[0]=last[0]=0;
     sz=1;
    }
    void add(char *s)
    {
        int u=0,n=strlen(s);
        for(int i=0;iq;
        for(int i=0;i

你可能感兴趣的:(数据结构:AC自动机)