洛谷—模板字典树 P8306

简介: 洛谷—模板字典树 P8306

a9262ed0dcecf6bfdde8097267f3df4d_bc67e089d80f4b3188f2b94ec1bfbab5.png先对输入的模式串进行处理建树

void insert(string x)
{
  int p=0;//创建根节点
  for(int i=0;i<x.size();i++)
  {
    int y=x[i]-'0';//对字符进行处理
    trie[p][y]=++id;
    p=trie[p][y];//进入下一层
    red[p]++;//储存到该点有多少模板串有此作为前缀
  }
}


之后对每次询问进行查询

int find(string x)
{
  int p=0;
  for(int i=0;i<x.size();i++)
  {
    int y=x[i]-'0';//处理模板串
    if(!trie[p][y])//未开创此条路线,直接结束
    return 0;
    p=trie[p][y];//进入下一层
  }
  return red[p];//返回答案
}

因为是多实例,每次对数组进行手动清空处理(用memset会MLE

for(int i=0;i<=id;i++)
    {
      for(int j=0;j<100;j++)
      trie[i][j]=0;
    }
    for(int i=0;i<=id;i++)
    red[i]=0;
    id=0;

AC代码:

#include<bits/stdc++.h>
using namespace std;
int trie[3000009][100];
int red[3000009];
int id;
void insert(string x)
{
  int p=0;
  for(int i=0;i<x.size();i++)
  {
    int y=x[i]-'0';
    trie[p][y]=++id;
    p=trie[p][y];
    red[p]++;
  }
}
int find(string x)
{
  int p=0;
  for(int i=0;i<x.size();i++)
  {
    int y=x[i]-'0';
    if(!trie[p][y])
    return 0;
    p=trie[p][y];
  }
  return red[p];
}
int main()
{
  int t;
  cin>>t;
  while(t--)
  {
    int n,q;
    cin>>n>>q;
    for(int i=0;i<=id;i++)
    {
      for(int j=0;j<100;j++)
      trie[i][j]=0;
    }
    for(int i=0;i<=id;i++)
    red[i]=0;
    id=0;
    for(int i=0;i<n;i++)
    {
      string x;
      cin>>x;
      insert(x);
    }
    for(int i=0;i<q;i++)
    {
      string x;
      cin>>x;
      cout<<find(x)<<endl;
    }
  }
  return 0;
}

目录
相关文章
|
7月前
|
机器学习/深度学习
【每日一题Day196】LC2106摘水果 | 枚举+前缀和数组 同向双指针+二分查找
【每日一题Day196】LC2106摘水果 | 枚举+前缀和数组 同向双指针+二分查找
58 0
|
7月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
56 0
|
7月前
|
算法 测试技术 vr&ar
☆打卡算法☆LeetCode 152. 乘积最大子数组 算法解析
☆打卡算法☆LeetCode 152. 乘积最大子数组 算法解析
|
5月前
|
算法
二分 模板
二分的另一个板子
40 1
|
7月前
|
Python
{二分模板}
{二分模板}
28 0
|
7月前
|
算法 测试技术 C#
前缀和|二分查找|LeetCode2234| 花园的最大总美丽值
前缀和|二分查找|LeetCode2234| 花园的最大总美丽值
|
算法
代码随想录算法训练营第八天 | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
代码随想录算法训练营第八天 | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
63 0
|
SQL 人工智能 开发框架
线段树模板+例题
线段树模板+例题
81 1
|
算法 索引
代码随想录算法训练营第八天 | 344.反转字符串541. 反转字符串II 剑指Offer 05.替换空格151.翻转字符串里的单词剑指Offer58-II.左旋转字符串
代码随想录算法训练营第八天 | 344.反转字符串541. 反转字符串II 剑指Offer 05.替换空格151.翻转字符串里的单词剑指Offer58-II.左旋转字符串
|
算法 安全
代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和