90分AC自动机求调,悬5关
查看原帖
90分AC自动机求调,悬5关
532109
freedom_wang楼主2024/7/22 14:18
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rop(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define por(i,a,b) for(int i=a;i>b;i--)
#define endl '\n'
#define pii pair<int,int>
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef double lf;
typedef long double ld;
using namespace std;
int n,cnt,rev[10000005],indeg[10000005],ans,vis[10000005],tot;
char s[100005],s1[1000005];
struct node{
	int fail,ans,son[27],flag;
	void init(){
		memset(son,0,sizeof(son));
		fail=flag=0;
	}
}trie[8000005];
queue<int>q;
void insert(char*s,int num){
	int u=1,len=strlen(s);
	rop(i,0,len){
		int to=s[i]-97;
		if(!trie[u].son[to])
			trie[u].son[to]=++cnt;
		u=trie[u].son[to];
	}
	if(!trie[u].flag)
		trie[u].flag=num;
	rev[num]=trie[u].flag;
}
void getfail(){
	rop(i,0,27)
		trie[0].son[i]=1;
	q.push(1);
	trie[1].fail=0;
	while(q.size()){
	    int u=q.front();
	    q.pop();
	    int fail=trie[u].fail;
	    rop(i,0,27){
			int to=trie[u].son[i];
			if(!to){
				trie[u].son[i]=trie[fail].son[i];
				continue;
			}
			trie[to].fail=trie[fail].son[i];
			indeg[trie[fail].son[i]]++;
			q.push(to);
	    }
	}
}
void topu(){
	rep(i,1,cnt)
		if(!indeg[i])
			q.push(i);
	while(q.size()){
		int fr=q.front();
		q.pop();
		vis[trie[fr].flag]=trie[fr].ans;
		int u=trie[fr].fail;
		trie[u].ans+=trie[fr].ans;
		if((--indeg[u])==0)
			q.push(u);
	} 
}
void query(char*s){
	int u=1,len=strlen(s);
	rop(i,0,len){
		u=trie[u].son[s[i]-97];
		trie[u].ans++;
	}
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	rep(i,0,cnt)
		trie[i].init();
	rep(i,1,n)
		vis[i]=0;
	cnt=1;
	ans=0;
	rep(i,1,n){
		cin>>s;
		rop(j,0,strlen(s))
			s1[tot++]=s[j];
		s1[tot++]='{';
		insert(s,i);
	}
	getfail();
	query(s1);
	topu();
	rep(i,1,n)
		cout<<vis[rev[i]]<<endl; 
	return 0;
}
/*
?现在jc方式那么低级啊
*/

https://www.luogu.com.cn/record/167636279

2024/7/22 14:18
加载中...