ac자동기(템플릿+조금씩 최적화)
6451 단어 문자열
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1000005;//
struct ac_auto{
const static int letter_size = 26;
const static int trie_size = (1e6+50);
int tot , root ,fail[trie_size],end[trie_size],next[trie_size][letter_size];
int newnode()
{
end[tot]=0;
memset(next[tot],-1,sizeof next[tot]);
return tot++;
}
void init()
{
tot=0;
root=newnode();
}
int getidx(char x){
return x-'a';
}
void insert(char ss[])//
{
int len=strlen(ss);
int now=root;
for(int i=0;iint id=getidx(ss[i]);
if(next[now][id]==-1)
{
next[now][id]=newnode();
}
now=next[now][id];
}
end[now]++;
}
void getfail()// fail
{
queue<int>q;
fail[root]=root;
for(int i=0;i//
{
if(next[root][i]!=-1)
{
fail[next[root][i]]=root;
q.push(next[root][i]);
}
else
{
next[root][i]=root;
}
}
while(!q.empty())
{
int now=q.front();q.pop();
for(int i=0;iif(next[now][i]!=-1)
{
fail[next[now][i]]=next[fail[now]][i];// next[now][i] , fail 。
q.push(next[now][i]);
}
else next[now][i]=next[fail[now]][i];// next[now][i] ,
}
}
}
int match(char ss[])
{
int sum=0,now=root;
int len=strlen(ss);
for(int i=0;iint id=getidx(ss[i]);
int tmp=now=next[now][id];
while(tmp)
{
//
//if(end[tmp]!=-1)
//res += end[tmp];
//
if(end[tmp]==-1)break;//
sum+=end[tmp];
end[tmp]=-1;
tmp=fail[tmp];
}
}
return sum;
}
};
ac_auto ac;
char ss[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
ac.init();
for(int i=0;iscanf("%s",ss);
ac.insert(ss);
}
ac.getfail();
scanf("%s",ss);
printf("%d
",ac.match(ss));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
비슷한 이름의 Attribute를 많이 만들어 삭제하는 Houdini사용 소프트웨어는 Houdini16.5입니다 배열에서는 애트리뷰트의 보간이 잘 동작하지 않는 것과 AttributeCreateSOP 노드에서 Size가 4를 넘는 애트리뷰트를 작성해도 값이 조작할 수 없어 의미가 없...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.