2.数据结构:1.Tire 字符串统计

[复制链接]
发表于 2025-10-22 08:25:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1.Tire 字符串统计
  1. #include<algorithm>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5. const int N=100010;
  6. int son[N][26];//至多 N 层,每一层至多 26 个节点(字母)
  7. int cnt[N];//字符串至多 N 个,标记每个字符串的最后一个字母,
  8. //统计出现次数
  9. int idx;//用到的节点的总数
  10. char str[N];//单次输入的字符串
  11. void insert(char str[]){
  12.     int p=0;//根节点
  13.     for(int i=0;str[i];i++){//字符串的每一个字母分别存在每一层
  14.         int u=str[i]-'a';//把 a-z 映射到 0-25
  15.         if(!son[p][u]){//假设该节点不存在
  16.             son[p][u]=++idx;//把该节点构造出来
  17.         }
  18.         p=son[p][u];//走到下一层的节点
  19.     }
  20.     cnt[p]++;//标记字符串的最后一个字母,维护计数器
  21. }
  22. //查询和插入同理,不再赘述
  23. int query(char str[]){
  24.     int p=0;
  25.     for(int i=0;str[i];i++){
  26.         int u=str[i]-'a';
  27.         if(!son[p][u]){
  28.             return 0;
  29.         }
  30.         p=son[p][u];
  31.     }
  32.     return cnt[p];
  33. }
  34. int main(){
  35.     int n;
  36.     cin>>n;
  37.    
  38.     while(n--){
  39.         char op[2];
  40.         cin>>op>>str;
  41.         if(op[0]=='I'){
  42.             insert(str);
  43.         }else{
  44.             printf("%d\n",query(str));
  45.         }
  46.     }
  47.    
  48.     return 0;
  49. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表