文章

82

粉丝

343

获赞

27

访问

662.2k

头像
边建Trie树边删多余前缀
P1098 中山大学2018年机试
发布于2021年2月2日 13:14
阅读数 8.3k

两种情况

   case1 当前字符串是前面某一个更长串的前缀:判断一下它的son[p][0~25]是否有不为0的元素

   case2 当前字符串的前缀是前面某一个短的字符串:建立当前字符串结点路径上如果某一个结点cnt!=0说明这里有前缀 cnt=0删除即可

            

 

#include<iostream>
#include<string.h>
using namespace std;

const int maxn=10050;

int son[maxn][26],cnt[maxn];
int idx;
int res;
//Trie树 
void insert(char *s){
    int p=0;
    for(int i=0;s[i];i++){
        int u=s[i]-'a';
        if(cnt[p]!=0) cnt[p]=0;//如果前面的串是当前串的前缀 
        
        if(!son[p][u]) son[p][u]=++idx;
        p=son[p][u];
    }
    int flag=0;
    for(int i=0;i<26;i++){
        if(son[p][i]!=0){
         &nb...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发