社区讨论

求调 56pts AC on 1 2 3 5 玄关

P7537[COCI 2016/2017 #4] Rima参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mjy25d7b
此快照首次捕获于
2026/01/03 16:45
2 个月前
此快照最后确认于
2026/01/06 22:55
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e6+100;
int fa[maxn],siz[maxn],son[maxn][40],tot;
bool vis[maxn];
int find(int x){
	return (fa[x] == x)?x:fa[x] = find(fa[x]);
}
void insert(string s){
	int sizs = s.size(),cur = 0;
	for(int i = 0;i<sizs;i++){
		int nxt = s[i]-'a';
		if(!son[cur][nxt])son[cur][nxt] = ++tot,fa[tot] = tot,siz[tot] = 1;
		cur = son[cur][nxt]; 
	}
	vis[cur] = 1;
	return ;
}
void dfs(int cur,int fat){
	if(vis[cur] && vis[fat] && find(cur)!=find(fat)){
		siz[find(fat)]+=siz[find(cur)];
		fa[find(cur)] = find(fat);
	}
	int hd = 0;
	for(int i = 0;i<=25;i++){
		int nxt = son[cur][i];
		if(!nxt)continue;
		if(vis[nxt]){
			if(hd && find(hd)!=find(nxt)){
				siz[find(hd)]+=siz[find(nxt)];
				fa[find(nxt)] = find(hd);				
			}
			hd = nxt;
		}
		dfs(nxt,cur);
	}
	return ;
}
int main(){
	int n;
	cin>>n;
	string s;
	for(int i = 1;i<=n;i++){
		cin>>s;
		reverse(s.begin(),s.end());
		insert(s);
	}
	dfs(0,-1);
	int ans = 0;
	for(int i = 0;i<=tot;i++){
		if(find(i) == i){
			ans = max(ans,siz[i]);
		}
	}
	cout<<ans;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...