字典树 插入 排序 分配id

来源:互联网 发布:冬天日本哪里好玩 知乎 编辑:程序博客网 时间:2024/06/06 15:49

字典树分配id最常见,其他一半很少用,也可能渣做的题比较少

贴代码,代码有解释:

#include <cstdio>#include <cstring>#include <algorithm>#include <string>using namespace std;int cnt;struct  node{    int id;    int prefix;//记录前缀个数    node *next[26];//指向字典树下一层,如果全是小写字母是26这视情乱而定    node(){        for(int i=0;i<26;i++)        next[i]=NULL;        id =0;        prefix=0;    }//初始化}*root;int  Insert(char *s){    int len =strlen (s);    node *p= root;    for(int i=0;i<len;i++){        int k=s[i]-'a';        if(p->next[k]==NULL){            p->next[k]=new node();        }        p=p->next[k];        p->prefix++;    }    if(p->id==0)    return p->id=++cnt;    return p->id;}//插入并分配idint  find(char s[]){    int len =strlen(s);    node *p =root;    for(int i=0;i<len;i++){        p=p->next[s[i]-'a'];    }    return p->prefix;}//查找此前缀是多少人的前缀int x;//记录总共有多少字符串参与了排序int all[200];//记录排好序的idvoid output(node *p){      if(p!=NULL){           if(p->id!=0){                all[x++]=p->id;            }        for(int i=0;i<26;i++){            if(p->next[i]){            output(p->next[i]);            }        }      }}//字符串排序int main(){    cnt =0;    root =new node();    char s[100][100];    char s2[100][100];    int n;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%s",s[i]);        printf("%d\n",Insert(s[i]));        strcpy(s2[Insert(s[i])],s[i]);    }    for(int i=0;i<n;i++){        printf("%d\n",find(s[i]));    }    /*排序后*/    x=0;    output(root);    printf("%d\n",x);    for(int i=0;i<x;i++){        printf("%d %s\n",all[i],s2[all[i]]);    }}


0 0