洛谷—模板字典树 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;
}

目录
相关文章
|
4月前
树状数组模板
树状数组模板
35 0
|
4月前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
48 1
|
4月前
线段树模板
线段树模板
41 0
|
SQL 人工智能 开发框架
线段树模板+例题
线段树模板+例题
71 1
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
58 0
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
58 0
|
算法
回溯算法 全排列模板
回溯算法 全排列模板
70 0
二分搜索的三种模板
二分搜索的三种模板
63 0