码迷,mamicode.com
首页 > 编程语言 > 详细

字典树 插入 排序 分配id

时间:2014-12-01 17:40:17      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:algorithm   strcpy   cstring   c++   struct   

字典树分配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;
}//插入并分配id

int  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];//记录排好序的id

void 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]]);
    }

}


字典树 插入 排序 分配id

标签:algorithm   strcpy   cstring   c++   struct   

原文地址:http://blog.csdn.net/u013076044/article/details/41649475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!