Uva 11488(Trie数统计最大公共子串长度*个数)

Trie树模板题


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ans;
char str[205];
struct Trie
{
    int index;
    Trie *next[10];
    Trie()
    {
        index=0;
        memset(next,0,sizeof(next));
    }
};

void Insert(Trie *tr,char *s,int len)
{
    tr->index++;
    ans=max(ans,tr->index*len);
    if(*s!='\0')
    {
        if(tr->next[*s-'0']==0)
            tr->next[*s-'0']=new Trie;
        Insert(tr->next[*s-'0'],s+1,len+1);
    }
}
int main()
{
    int T,n,i,j,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        Trie *root=new Trie;

        ans=0;
        while(n--)
        {
            scanf("%s",str);
            Insert(root,str,0);
        }
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Trie实现词频统计并输出前 n 个出现次最多的单词的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_WORD_LEN 50 #define MAX_N 100 // 定义 Trie 树结点 typedef struct trie_node { int count; // 记录单词出现次 struct trie_node* next[26]; // 指向下一个字符的指针组 } trie_node; // 插入单词到 Trie 树中 void insert_trie(trie_node* root, char* word) { trie_node* cur = root; for (int i = 0; i < strlen(word); i++) { int index = word[i] - 'a'; if (!cur->next[index]) { cur->next[index] = (trie_node*)malloc(sizeof(trie_node)); cur->next[index]->count = 0; for (int j = 0; j < 26; j++) { cur->next[index]->next[j] = NULL; } } cur = cur->next[index]; } cur->count++; } // 比较函,用于排序 int cmp(const void* a, const void* b) { return (*(trie_node**)b)->count - (*(trie_node**)a)->count; } // 获取 Trie 树中前 n 个出现次最多的单词 void get_top_n(trie_node* root, trie_node** top_n, int* n) { if (!root) { return; } // 遍历 Trie 树,找到出现次前 n 大的单词 for (int i = 0; i < 26; i++) { if (root->next[i]) { trie_node* cur = root->next[i]; if (cur->count > top_n[*n - 1]->count) { top_n[*n - 1] = cur; qsort(top_n, *n, sizeof(trie_node*), cmp); } get_top_n(cur, top_n, n); } } } // 打印前 n 个出现次最多的单词 void print_top_n(trie_node** top_n, int n) { printf("Top %d words:\n", n); for (int i = 0; i < n; i++) { if (top_n[i]->count == 0) { break; } printf("%d: ", i + 1); trie_node* cur = top_n[i]; char word[MAX_WORD_LEN]; int len = 0; // 从 Trie 树中回溯到根节点,构造出单词 while (cur != NULL) { word[len++] = 'a' + (cur - cur->next[0]); cur = cur->parent; } for (int j = len - 2; j >= 0; j--) { printf("%c", word[j]); } printf(" (%d occurrences)\n", top_n[i]->count); } } int main() { trie_node* root = (trie_node*)malloc(sizeof(trie_node)); root->count = 0; for (int i = 0; i < 26; i++) { root->next[i] = NULL; } // 读取文件中的单词并插入到 Trie 树中 FILE* fp = fopen("input.txt", "r"); char word[MAX_WORD_LEN]; while (fscanf(fp, "%s", word) != EOF) { insert_trie(root, word); } fclose(fp); // 获取前 n 个出现次最多的单词 int n = 10; trie_node** top_n = (trie_node**)malloc(n * sizeof(trie_node*)); for (int i = 0; i < n; i++) { top_n[i] = root; } get_top_n(root, top_n, &n); // 打印结果 print_top_n(top_n, n); // 释放内存 for (int i = 0; i < n; i++) { free(top_n[i]); } free(top_n); return 0; } ``` 该代码使用 Trie统计文本中单词出现次,并输出前 n 个出现次最多的单词。其中,将单词插入到 Trie 树中的函 `insert_trie` 使用了循环遍历单词的每一个字符,依次将其插入到 Trie 树中。获取前 n 个出现次最多的单词的函 `get_top_n` 使用了深度优先遍历 Trie 树的方法,递归查找出现次前 n 大的单词。在打印前 n 个出现次最多的单词时,将每个单词从 Trie 树的叶子节点回溯到根节点,构造出单词并打印。注意,该代码假定输入文件中所有单词都是小写字母构成的,且单词长度不超过 50。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值