zoukankan      html  css  js  c++  java
  • Trie树

    简单的字符串算法。出一个纯原创板子吧。

    不要忘记字典树和哈希的联系。

    HDU1251,计算相同前缀的数目。

     1 #include<bits/stdc++.h>
     2 #define scan(i) scanf("%d",&i)
     3 #define pf printf
     4 #define ll long long
     5 #define f(i,a,b) for(int i=a;i<=b;i++)
     6 using namespace std;
     7 struct node{
     8     int num;
     9     int child[26];
    10 }no[260005];
    11 int tot=0;
    12 char tel[1005];
    13 void insert(char in[]){
    14     int len=strlen(in+1);
    15     int init=0;
    16     f(i,1,len){
    17         int tem=in[i]-'a';
    18         if(no[init].child[tem]==0){
    19             tot++;
    20             no[init].child[tem]=tot;
    21             init=tot;
    22         }
    23         else init=no[init].child[tem];
    24         no[init].num++;
    25     }
    26 }
    27 int query(char in[]){
    28     int len=strlen(in+1);
    29     int init=0;
    30     f(i,1,len){
    31         int tem=in[i]-'a';
    32         if(no[init].child[tem]==0) return 0;
    33         else init=no[init].child[tem];
    34     }
    35     return no[init].num;
    36 }
    37 int main(){
    38     bool f=true;
    39     while(cin.getline(tel+1,1005)){
    40         if(strcmp(tel+1,"")==0){
    41             f=false;
    42             continue;
    43         }
    44         if(f==true){
    45             insert(tel);
    46         }
    47         else{
    48             pf("%d
    ",query(tel));
    49         }
    50     }
    51 } 

    HDU1671,判断是否存在两个字符串,其中一个字符串是另一个字符串的前缀。

     1 #include<bits/stdc++.h>
     2 #define scan(i) scanf("%d",&i)
     3 #define pf printf
     4 #define ll long long
     5 #define f(i,a,b) for(int i=a;i<=b;i++)
     6 using namespace std;
     7 int t,n;
     8 struct node{
     9     int num;
    10     int child[10];
    11 }no[100005];
    12 int tot=0;
    13 char tel[15];
    14 bool insert(char in[]){
    15     int len=strlen(in+1);
    16     int init=0;
    17     f(i,1,len){
    18         if(no[init].num==-2) return false;
    19         int tem=in[i]-'0';
    20         if(no[init].child[tem]==0){
    21             tot++;
    22             no[init].child[tem]=tot;
    23             init=tot;
    24             if(i-len) no[init].num=-1;
    25             else no[init].num=-2;
    26         }
    27         else init=no[init].child[tem];
    28     }
    29     if(no[init].num==-1) return false;
    30     return true;
    31 }
    32 int main(){
    33     scan(t);
    34     f(kk,1,t){
    35         scan(n);
    36         bool f=true;
    37         f(i,1,n){
    38             scanf("%s",tel+1);
    39             if(f==true){
    40                 if(insert(tel)==false){
    41                     f=false;
    42                 }
    43             }
    44         }
    45         if(f==true) puts("YES");
    46         else puts("NO");
    47         memset(no,0,sizeof(no));
    48         tot=0;
    49     }
    50 } 
  • 相关阅读:
    Recon-Erlang线上系统诊断工具
    erlang pool模块。
    深度学习Bible学习笔记:第二、三章 线性代数 概率与信息论
    LeetCode(5):最长回文子串
    LeetCode(4):两个排序数组的中位数
    LeetCode(3):无重复字符的最长子串
    LeetCode(2):Add Two Numbers 两数相加
    LeetCode(1):两数之和
    深度学习Bible学习笔记:第一章 前言
    2018年3月18日论文阅读
  • 原文地址:https://www.cnblogs.com/St-Lovaer/p/12252234.html
Copyright © 2011-2022 走看看