• [trie树] hihocoder 1107 Shortest Proper Prefix


    题目大意

    题目链接,给定 (n) 个字符串,问有多少个前缀是 shortest proper prefix。数据量较小。

    算法思路

    shortest proper prefix 根据题目中解释为前缀出现过不超过5次,且该前缀所有更短的前缀出现过多于5次。建立一颗trie树,维护每个节点所表示前缀的单词数。

    算法代码

    
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    
    struct node
    {
    	node* child[26];   // 'a' ... 'z' child pointer
    	node* parent;      // parent pointer, root->parent=NULL
    
    	int freq;
    
    	node() {
    		freq = 0;
    		memset(child, 0, sizeof(child));
    		parent = NULL;
    	}
    };
    
    char buf[2000005];
    int len;
    node *root;
    
    void insert(node* p, int k)        // insert string
    {
    	if (p == NULL || k == len)
    		return;
    	p->freq++;
    	
    	if (p->child[buf[k] - 'a'] == NULL) {
    		p->child[buf[k] - 'a'] = new node();
    		p->child[buf[k] - 'a']->parent = p;
    	}
    	insert(p->child[buf[k] - 'a'], k + 1);
    }
    
    void del(node *p)          // delete all trie node
    {
    	if (p == NULL)
    		return;
    	for (int i = 0; i < 26; i++) {
    		if (p->child[i] != NULL)
    			del(p->child[i]);
    		p->child[i] = NULL;
    	}
    	delete p;
    	p = NULL;
    }
    
    int tri(node *p)
    {
    
    	if (p->parent != NULL) {
    		if (p->freq <= 5 && p->parent->freq>5)        // shortest proper prefix!
    			return 1;
    	}
    
    	int ans = 0;
    	for (int i = 0; i < 26; i++) {
    		if (p->child[i] != NULL)
    			ans += tri(p->child[i]);
    	}
    	return ans;
    }
    
    int main()
    {
    	int n;
    	scanf("%d", &n);
    	
    	root = new node();
    	while (n--) {
    		scanf("%s", buf);
    		len = strlen(buf);
    
    		insert(root, 0);
    	}
    
    	int ans = tri(root);
    	del(root);
    
    	printf("%d
    ", ans);
    	return 0;
    }
    
    
  • 相关阅读:
    [SAM4N学习笔记]UART的使用
    [SAN4N学习笔记]使用SysTick精准延时
    [SAM4N学习笔记]LED点灯程序
    [SAM4N学习笔记]SAM4N工程模板搭建
    C#用大石头Xcode做数据底层注意事项
    C#MVC中@HTML中的方法
    js比较时间大小(时间为以-分割的字符串时)
    C#后台Post提交XML 及接收该XML的方法
    jq对象和DOM对象的互换
    获取和设置HTML标签中的数据
  • 原文地址:https://www.cnblogs.com/lessmore/p/hihocoder-1107.html
Copyright © 2020-2023  润新知