50pts求调!!
查看原帖
50pts求调!!
528802
AC_notonlyAC楼主2025/7/22 20:06

调了2.5h实在调不出来。。。

#include<bits/stdc++.h>
#define ll int
using namespace std;
ll n,idx,f[300005][28],tot,e[30][30],in[30005],ed[30005],ok[30005];
ll vis[30005];
string ss[30005];
queue<ll> q;
ll getnum(char c)
{
	return c-'a';
}
void build(string s)
{
	ll p=0;
	for(ll i=0;i<s.size();i++)
	{
		ll c=getnum(s[i]);
		if(!f[p][c]) f[p][c]=++idx;
		p=f[p][c];
	}
	ed[p]=1;
}
void toposort()
{
	while(q.size()) q.pop();
	for(ll i=0;i<26;i++)
	{
		if(!in[i])
		{
			//cout<<i<<" ";
			q.push(i);
			vis[i]=1;
		}
	}
	while(!q.empty())
	{
		ll u=q.front();
		q.pop();
		for(ll i=0;i<26;i++)
		{
			if(!e[u][i]) continue;
			in[i]--;
			if(!in[i])
			{
				//cout<<i<<" ";
				q.push(i);
				vis[i]=1;
			}
		}
	}
}
bool find(string s)
{
	memset(e,0,sizeof e);
	memset(in,0,sizeof in);
	memset(vis,0,sizeof vis);
	ll u=0;
	for(ll i=0;i<s.size();i++)
	{
		if(ed[u]) return 0;
		ll c=getnum(s[i]);
		for(ll j=0;j<26;j++)
		{
			if(c!=j&&f[u][j]&&!e[c][j])
			{
				e[c][j]=1;
				in[j]++;
			}
		}
		u=f[u][c];
	}
	toposort();
//	cout<<endl;
	for(ll i=0;i<26;i++)
	{
		if(!vis[i]) return 0;
	}
	return 1;
}
int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n;
	for(ll i=1;i<=n;i++)
	{
		cin>>ss[i];
		build(ss[i]);
	}
	for(ll i=1;i<=n;i++)
	{
		if(find(ss[i]))
		{
			tot++;
			ok[tot]=i;
		//	cout<<i<<" "<<ok[tot]<<endl;
		}
	}
	//cout<<endl;
	cout<<tot<<endl;
	for(ll i=1;i<=tot;i++) cout<<ss[ok[i]]<<endl;
}
2025/7/22 20:06
加载中...