社区讨论
求调 40ptsWA 闭关
P4471[BJWC2018] 词韵参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjxx4zw0
- 此快照首次捕获于
- 2026/01/03 14:25 2 个月前
- 此快照最后确认于
- 2026/01/06 20:25 2 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e6+100;
int fa[maxn],siz[maxn],son[maxn][30],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){
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 = 1;i<=tot;i++){
if(find(i) == i){
ans = max(ans,siz[i]);
}
}
cout<<ans;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...