我是靠谱客的博主 故意犀牛,最近开发中收集的这篇文章主要介绍hsy单词,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意:略

在ac自动机上,一个节点出现的次数等于能通过fail到它的节点的次数之和。而叶节点就等于它被爬过的次数。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-12;
typedef long long lon;
const lon SZ=1000010,SSZ=51,APB=26,one=1,INF=0x7FFFFFFF,mod=1000000007;
int n,nex[SZ][APB],cnt,num[SZ];
int fail[SZ],match[SZ],in[SZ],ans[SZ];
char ch[SZ];
void build(int x)
{
int cur=0;
for(int i=1;ch[i];++i)
{
int c=ch[i]-'a';
if(!nex[cur][c])nex[cur][c]=++cnt;
cur=nex[cur][c];
++num[cur];
//cout<<num[cur]<<endl;

}
match[x]=cur;
}
void build_fail()
{
queue<int> q;
q.push(0);
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=0;i<APB;++i)
{
if(nex[fr][i])
{
int u=nex[fr][i];
if(fr==0)
{
fail[u]=0;
}
else
{
int v=fail[fr];
for(;!nex[v][i]&&v;v=fail[v]);
if(nex[v][i])fail[u]=nex[v][i];
else fail[u]=0;
}
q.push(u);
}
}
}
}
void topo()
{
for(int i=1;i<=cnt;++i)
{
++in[fail[i]];
}
stack<int> stk;
for(int i=1;i<=cnt;++i)
{
if(!in[i])
{
stk.push(i);
//cout<<"i: "<<i<<endl;

}
ans[i]=num[i];
}
for(;stk.size();)
{
int top=stk.top();
stk.pop();
--in[fail[top]],ans[fail[top]]+=ans[top];
if(!in[fail[top]])
{
stk.push(fail[top]);
}
}
}
void init()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>ch+1;
build(i);
}
build_fail();
topo();
for(int i=1;i<=n;++i)
{
cout<<ans[match[i]]<<endl;
}
}
void work()
{
}
int main()
{
std::ios::sync_with_stdio(0);
//freopen("d:\1.txt","r",stdin);
int casenum;
//cin>>casenum;
//cout<<casenum<<endl;
//for(int time=1;time<=casenum;++time)
//for(int time=1;cin>>n>>qnum,n;++time)

{
//cout<<"Case "<<time<<": ";

init();
work();
}
return 0;
}

 

转载于:https://www.cnblogs.com/gaudar/p/10740369.html

最后

以上就是故意犀牛为你收集整理的hsy单词的全部内容,希望文章能够帮你解决hsy单词所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部