• NYoj 685 查找字符串


    描述

    小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。

     
    输入
    第一行包含一个整数T(T<=100).表示测试数据组数。
    接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。
    接下来n行,每行包含一个字符串,长度不大于15。
    接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。
    输出
    输出每组小明询问数串出现的次数。
    样例输入
    1
    5 3
    hello
    it@is+so@easy
    hello
    ibelieveicanac
    hello
    hello
    icannotacit
    Giveup
    
    样例输出
    3
    0
    0


    题解:水题,就是多判断了“+”,“@”的情况,修改一下模板即可。



    代码:
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <ctype.h>
     7 #include <iomanip>
     8 #include <queue>
     9 #include <stdlib.h>
    10 using namespace std;
    11 
    12 
    13 struct node
    14 {
    15     int count;     
    16     node *next[28];    
    17     node(){          //构造函数
    18         count=0;
    19         memset(next,0,sizeof(next));
    20     }
    21 };
    22 node *root;
    23 int k=0;
    24 void insert(char *a)
    25 {
    26     int l=strlen(a);
    27     node *p=root;
    28     int i;
    29     for(i=0;i<l;i++)
    30     {
    31         if(p->next[a[i]-'+']==0)
    32         {
    33             p->next[a[i]-'+']=new node;
    34         }    
    35         // 已存在此前缀
    36         p=p->next[a[i]-'+'];
    37         p->count++;
    38     }
    39 }
    40 int find(char *s)
    41 {
    42     struct node *p;
    43     int len=strlen(s);
    44     if(len==0) return 0;
    45     p=root;
    46     for(int i=0;i<len;i++){
    47         if(p->next[s[i]-'+']!=0)
    48             p=p->next[s[i]-'+'];
    49         else
    50             return 0;
    51     }
    52     return p->count;
    53 }
    54 void de(node *p)
    55 {
    56     if(p==0)
    57         return ;
    58     int i;
    59     for(i=0;i<10;i++)
    60     {
    61         de(p->next[i]);
    62     }
    63     delete p;
    64 
    65 }
    66 int main()
    67 {
    68     int t;
    69     scanf("%d",&t);
    70     char a[15],b[15];
    71     while(t--)
    72     {
    73         root = new node;
    74         int n,m;
    75         k=0;
    76         scanf("%d%d",&n,&m);
    77         int i;
    78         for(i=0;i<n;i++)
    79         {
    80             scanf("%s",a);
    81             insert(a);
    82         }
    83         for(i=0;i<m;i++){
    84             scanf("%s",b);
    85             int ans=0;
    86             ans=find(b);
    87             printf("%d
    ",ans);
    88         }
    89         de(root);
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    新的宝库,新的目标
    聊聊生活——一点人生经验
    消息推送
    基于Hbase与Phoenix的联机实时大数据查询
    【转】DNS的工作原理及解析
    Tomcat NIO分析
    【转】Innodb 共享锁 排他锁 及应用
    java线程池与tomcat线程池策略算法上的异同
    docker 修改 mysql 5.7 sql_mode
    ContOs 将SpringBoot的jar制作成系统服务
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/5013929.html
Copyright © 2020-2023  润新知