@CZF2919 救我!!!
来了
看了
不会了
emmm,好像跟哈希有点关系,偶不对,是字典树
这是字典树
字典树我没学过
@金杭东 帮帮孩子
@吴梓峤 这是下节课的内容吧?
每个单词结尾做个标记,然后字典树上 dfs 取标记数量的最大值就行了啊
#include <bits/stdc++.h>
using namespace std;
const int N=50+5,maxn=5e5+10;
int n;
char s[N];
struct trie{
int end[maxn],ch[maxn][26],idx=0;
vector<int> son[maxn];//记录孩子节点
void insert(char *s){
int p=0;//树根
for(int i=0;s[i];i++){
int now_cnt=s[i]-'a';
if(!ch[p][now_cnt]){//若当前节点不存在
ch[p][now_cnt]=++idx;//创建新节点
son[p].push_back(now_cnt);//添加孩子
}
p=ch[p][now_cnt];//往下延伸
}
end[p]++;
}
int query(int u){
//利用dfs便利字典树,取单词结尾数的最大值
int ans=0,add=end[u];
if(son[u].size()==0) return ans+add;
for(auto v:son[u])
//寻找孩子
ans=max(ans,query(ch[u][v])+add);
return ans;
}
}tree;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>s,tree.insert(s);
cout<<tree.query(0);
return 0;
}
为什么c++编译器上样例能过,信友队上却RE呢?
@stringdp100005 快来啊
@CZF2919 也来帮我,你看看上面的思路就知道了
快来助我
这个空间分配不出来吧可能
那该怎么改?
用指针写法吗?
哦,A了,但严老师,帮我看看,我这份代码到底是卡过的,还是真的能过
#include <bits/stdc++.h>
using namespace std;
const int N=50+5,maxn=5e5+10;
int n;
char s[N];
struct trie{
int end[maxn],ch[maxn][26],idx=0;
void insert(const char *s){
int p=0;//树根
for(int i=0;s[i];i++){
int now_cnt=s[i]-'a';
if(!ch[p][now_cnt])//若当前节点不存在
ch[p][now_cnt]=++idx;//创建新节点
p=ch[p][now_cnt];//往下延伸
}
end[p]++;
}
int query(int u){
//利用dfs便利字典树,取单词结尾数的最大值
int ans=0,add=end[u];
for(int v=0;v<26;v++)
if(ch[u][v])
ans=max(ans,query(ch[u][v]));
return ans+add;
}
}tree;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>s,tree.insert(s);
cout<<tree.query(0);
return 0;
}