社区讨论
求助
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 条回复,欢迎继续交流。
正在加载回复...