社区讨论
求调 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 条回复,欢迎继续交流。
正在加载回复...