zoukankan      html  css  js  c++  java
  • 字典树HihoCoder

    输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。

    在20%的数据中n, m<=10,词典的字母表大小<=2.

    在60%的数据中n, m<=1000,词典的字母表大小<=5.

    在100%的数据中n, m<=100000,词典的字母表大小<=26.

    本题按通过的数据量排名哦~

    Output

    对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

    Sample Input

    5
    babaab
    babbbaaaa
    abba
    aaaaabaa
    babaababb
    5
    babb
    baabaaa
    bab
    bb
    bbabbaab

    Sample Output

    1
    0
    3
    0
    0
    
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char temp[100001];
    int t[300001][30],pos=1,num[300001];
    void insert(char *s)
    {
    	int rt = 0;
    	int len = strlen(s);
    	for (int i = 0; i < len; i++)
    	{
    		int x = s[i] - 'a';
    		if (!t[rt][x])
    			t[rt][x] = pos++;
    		rt = t[rt][x];
    		num[rt]++;//记录前缀次数
    	}
    }
    void search(char *s)
    {
    	int rt = 0;
    	for (int i = 0; s[i]; i++)
    	{
    		int x = s[i] - 'a';
    		if (!t[rt][x])
    		{
    			printf("0
    ");
    			return;
    		}
    		rt = t[rt][x];
    	}
    	printf("%d
    ", num[rt]);
    }
    int main()
    {
    	int n, m;
    	scanf("%d", &n);
    	for (int i = 0; i < n; i++)
    		scanf("%s", temp),
    		insert(temp);
    	scanf("%d", &m);
    	for (int i = 0; i < m; i++)
    		scanf("%s", temp),
    		search(temp);
    	return 0;
    }
    
  • 相关阅读:
    杭州西湖、苏州园林
    新加坡
    泰国
    旅游常用英语语句
    React 脚手架支持Typescript和Sass
    用 Scoop 管理你的 Windows 软件
    Asp.Net Core WebAPI+PostgreSQL部署在Docker中
    Ionic 4 核心概念
    Ionic Framework 4 介绍
    Google Flutter框架:使用VS Code进行开发
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/9893123.html
Copyright © 2011-2022 走看看