社区讨论

求助

P3796AC 自动机(简单版 II)参与者 5已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mi7ync07
此快照首次捕获于
2025/11/21 05:45
4 个月前
此快照最后确认于
2025/11/21 06:44
4 个月前
查看原帖
题解里的code我都看不懂,求大佬help me!
CPP
样例:
2
aba
bab
ababababac
我的程序能求出总共7个。
但是怎么将他们分开求啊?
CPP
如:
aba:4
bab:3

求助啊!!!

CPP
代码:
#include<bits/stdc++.h>
#define rt register int
#define M 1000010
using namespace std;
int n;char s[M];
struct Aho
{
    struct state{int cnt,next[26],fail;}a[M];
    std::queue<int> q;int size;
     inline void init()
     {
         while(q.size()) q.pop();
         for(rt i=0;i<M;++i)
         {
             memset(a[i].next,0,sizeof(a[i].next));
             a[i].cnt=a[i].fail=0;
         }size=1;
     }
    inline void insert(char *s)
    {
        rt k=strlen(s),now=0;
        for(rt i=0;i<k;++i)
        {
            char c=s[i];
            if(!a[now].next[c-'a']) a[now].next[c-'a']=size++;
            now=a[now].next[c-'a'];
        }a[now].cnt++;
    }
    inline void build()
    {
        a[0].fail=-1;q.push(0);
        while(q.size())
        {
            rt u=q.front();q.pop();
            for(rt i=0;i<26;++i)
              if(a[u].next[i])
              {
                  if(!u) a[a[u].next[i]].fail=0;
                  else
                  {
                      rt v=a[u].fail;
                      while(v!=-1)
                      {
                          if(a[v].next[i]) 
                          {
                              a[a[u].next[i]].fail=a[v].next[i];
                              break;
                          }v=a[v].fail;
                      }if(v==-1) a[a[u].next[i]].fail=0;
                  }q.push(a[u].next[i]);
              }
        }
    }
    inline int gets(rt u)
    {
        rt res=0;
        while(u)
        {
            res+=a[u].cnt;
            //a[u].cnt=0;
            u=a[u].fail;
        }return res;
    }
    inline int match(char *s)
    {
        rt k=strlen(s),now=0,res=0;
        for(rt i=0;i<k;++i)
        {
            char c=s[i];
            if(a[now].next[c-'a']) now=a[now].next[c-'a'];
            else
            {
                rt p=a[now].fail;
                while(p!=-1&&a[p].next[c-'a']==0) p=a[p].fail;
                if(p==-1) now=0;
                else now=a[p].next[c-'a'];
            }printf("%d ",gets(now));
            /*if(a[now].cnt) res+=*/
        }return res;
    }
}aho;
int main()
{
    scanf("%d",&n);
    aho.init();
    for(rt i=0;i<n;++i) {scanf("%s",s);aho.insert(s);}
    aho.build();
    scanf("%s",s);
    printf("\n%d\n",aho.match(s));
    return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...