精华内容
下载资源
问答
  • 实现一个 Trie (前缀树),包含insert,search, 和startsWith这三个操作。 示例: Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 true trie.search("app...

    题目描述:

    实现一个 Trie (前缀树),包含 insertsearch, 和 startsWith 这三个操作。

    示例:

    Trie trie = new Trie();
    
    trie.insert("apple");
    trie.search("apple");   // 返回 true
    trie.search("app");     // 返回 false
    trie.startsWith("app"); // 返回 true
    trie.insert("app");   
    trie.search("app");     // 返回 true

    说明:

    • 你可以假设所有的输入都是由小写字母 a-z 构成的。
    • 保证所有输入均为非空字符串。

    解题思路:

    Trie树,又称字典树、前缀树,是一种树形结构,是哈希树的变种,是一种用于快速检索的多叉树结构。
    典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
    Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
    Trie树也有它的缺点,Trie树的内存消耗非常大。

    概念

    假设有and,as,at,cn,com这些关键词,那么如何构建Trie树呢?
    这里写图片描述

    从上面可以发现一些Trie树的特性:

    1. 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。
    2. 从根节点到某一节点的路径上的字符连接起来,就是该节点对应的字符串。
    3. 每个节点的所有子节点包含的字符都不相同。

     

    应用

    字符串的快速检索

    字典树的查询时间复杂度是O(logL),L是字符串的长度。所以效率还是比较高的。

    hash表:
    通过hash函数把所有的单词分别hash成key值,查询的时候直接通过hash函数即可,都知道hash表的效率是非常高的,为O(1)。对于单词查询,如果我们hash函数选取的好,计算量少,且冲突少,那单词查询速度肯定是非常快的。那如果hash函数的计算量相对大呢,且冲突率高呢?这些都是要考虑的因素。
    另外hash表不支持动态查询,什么叫动态查询,当我们要查询单词apple时,hash表必须等待用户把单词apple输入完毕才能hash查询。当你输入到appl时肯定不可能hash吧。
    字典树(tries树):
    对于单词查询这种,还是用字典树比较好,但也是有前提的,空间大小允许,字典树的空间相比较hash还是比较浪费的,毕竟hash可以用bit数组。
    字典树支持动态查询,比如apple,当用户输入到appl时,字典树此刻的查询位置可以就到达l这个位置,那么我在输入e时光查询e就可以了(更何况如果我们直接用字母的ASCII作下标肯定会更快)!字典树并不用等待你完全输入完毕后才查询。

    字符串排序

    先遍历字母序在前面的比如abdh,然后abdi。减少了没必要的strcmp,这个很好理解。

    最长公共前缀

    abdh和abdi的最长公共前缀是abd,遍历字典树到字母d时,此时这些单词的公共前缀是abd。

    自动匹配前缀显示后缀

    我们使用辞典或者是搜索引擎的时候,输入appl,后面会自动显示一堆前缀是appl的东东吧。
    那么有可能是通过字典树实现的,前面也说了字典树可以找到公共前缀,我们只需要把剩余的后缀遍历显示出来即可。

     

    代码:

    class Trie {
    public:
        /** Initialize your data structure here. */
        Trie(void){
            _root = new TrieNode();
        }
        ~Trie(void){
            clear(_root);
        }
        /** Inserts a word into the trie. */
        void insert(string word) { // 插入单词
            if(word.size() == 0) return;
            TrieNode* index = _root;
            for(int i = 0; i < word.size(); ++i){
                if(index->next[word[i] - 'a'] == NULL)
                    index->next[word[i] - 'a'] = new TrieNode;
                index = index->next[word[i] - 'a'];
            }
            ++index->val;
        }
        
        /** Returns if the word is in the trie. */
        bool search(string word) { // 查找单词
            if(word.size() == 0) return false;;
            TrieNode* index = _root;
            for(int i = 0; i < word.size(); ++i){
                if(index->next[word[i] - 'a'] == NULL)
                    return false;
                index = index->next[word[i] - 'a'];
            }
            return index->val == 0 ? false : true;
        }
        
        /** Returns if there is any word in the trie that starts with the given prefix. */
        bool startsWith(string prefix) { // 查找前缀
            if(prefix.size() == 0) return false;
            TrieNode* index = _root;
            for(int i = 0; i < prefix.size(); ++i){
                if(index->next[prefix[i] - 'a'] == NULL)
                    return false;
                index = index->next[prefix[i] - 'a'];
            }
            return true;
        }
    private:
        class TrieNode{ // 定义trie节点
            public:
                const static int MAX_CHILD = 26;
                int val;
                TrieNode* next[MAX_CHILD];
                TrieNode():val(0){
                    for(int i = 0; i < MAX_CHILD; ++i)
                        next[i] = NULL;
                }
        };
        TrieNode* _root;
        void clear(TrieNode* root){ // 析构过程
            if(root == NULL)
                return;
            for(int i = 0; i < root->MAX_CHILD; ++i)
                clear(root->next[i]);
            delete root;
            root = NULL;
        }
    };
    
    /**
     * Your Trie object will be instantiated and called as such:
     * Trie obj = new Trie();
     * obj.insert(word);
     * bool param_2 = obj.search(word);
     * bool param_3 = obj.startsWith(prefix);
     */

     

    参考文章:https://blog.csdn.net/jinzhao1993/article/details/52966761https://blog.csdn.net/bqw18744018044/article/details/82502435#%E5%9B%9B%E3%80%81Trie%E7%BB%93%E7%82%B9%E7%9A%84%E5%AE%9A%E4%B9%89

    展开全文
  • Trie树统计单词前缀

    2019-09-29 17:52:42
    输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。 例子输入 5 babaab babbbaaaa abba aaaaabaa babaababb 5 babb baabaaa bab bb bbabbaab 例子输出 1 0 3 0 0 #include #include ...

    输入

    输入的第一行为一个正整数n。表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦)。单词由不超过10个的小写英文字母组成,可能存在同样的单词。此时应将其视作不同的单词。接下来的一行为一个正整数m。表示小Hi询问的次数,其后m行。每一行一个字符串。该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。

    输出

    对于小Hi的每个询问。输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

    例子输入
    5
    babaab
    babbbaaaa
    abba
    aaaaabaa
    babaababb
    5
    babb
    baabaaa
    bab
    bb
    bbabbaab
    例子输出
    1
    0
    3
    0
    0


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int N, M;
    char buf[12];
    struct  Node {
        Node *next[26];
        int num;
    };
    
    Node *CreatNode() {
        Node *p = (Node *)malloc(sizeof(Node));
        p->num = 0;
        memset(p->next, 0, sizeof(p->next));
        return p;
    }
    
    void Insert(char *str, Node *p) {
        int id;
        for( ; *str; ++str) {
            id = *str - 'a';
            if(p->next[id] == NULL)
                p->next[id] = CreatNode();
            p = p->next[id];
            ++p->num;
        }
    }
    
    int query(char *str, Node *p) {
        int id;
        for( ; *str; ++str) {
            id = *str - 'a';
            p = p->next[id];
            if(p == NULL)
                return 0;
        }
        return p->num;
    }
    
    int main() {
        int i, j;   
        Node *root = CreatNode();
        scanf("%d", &N);
        while(N--) {
            scanf("%s", buf);
            Insert(buf, root);
        }
        scanf("%d", &M);
        while(M--) {
            scanf("%s", buf);
            printf("%d\n", query(buf, root));
        }
        return 0;
    }


    转载于:https://www.cnblogs.com/mfmdaoyou/p/6714358.html

    展开全文
  • 文章目录说明完整前缀(138个)常用前缀 说明 个人拙见:单词基本上都是由前缀词根后缀然后结合词性组成,所以,只要花大量时间死记硬背的吧前缀词根后缀都背熟以后,结合词性翻译或使用该单词,效率比直接被单词或 ...

    说明

    个人拙见:单词基本上都是由前缀词根后缀然后结合词性组成,所以,只要花大量时间死记硬背的吧前缀词根后缀都背熟以后,结合词性翻译或使用该单词,效率比直接被单词或 通过文章背单词效率高很多。

    完整前缀(138个)

    注:下面一个前缀有多重意思的,我都是分开写的,所以你看到有重复的,并不是我搞错了!
    要看使用示例,去看该百度文库中的内容:史上最全英语前缀大全

    序号“ - ”表示单词位置解释
    1a-加在单词或词根前面, 表示 不,无,非
    2a-加在单词前, 表示 在…, …的
    3ab-, abs-加在词根前,表示 相反,变坏,离去 等
    4ab-, ac-, ad-, af-, ag-, an-, ap-, ar-, as-, at-等加在同辅音字母词根前,表示 一再 等加强意
    5ad-加在单词或词根前, 表示 做…, 加强…
    6amphi-表示 两个、两种
    7an-在词根前, 表示 不,无
    8ana-表示 错误,在旁边,分开
    9ante-表示 前面,先
    10anti-表示 反对,相反
    11apo-表示 离开,远离
    12auto-表示 自动、自已
    13be-构成动词,表示 使…成为
    14be-构成一些介词
    15bene-表示 善, 好
    16bi-表示 二个, 两
    17by-表示 在旁边,副的
    18cata-表示 向下,相反,离开
    19circum-表示 环绕,周围
    20co-表示 共同 ,通常放元音词根前
    21col-, cor-在同辅音词根前, 表示 共同
    22com-, con-表示 共同
    23contra-表示 反对,相反
    24counter-表示 反对,相反
    25de-表示 去掉,变坏,离开,变慢,向下 等
    26de-表示 使…成为, 加强 等
    27deca-表示 十
    28deci-表示 十分之一
    29demi-表示 半
    30di-表示 二个,双
    31di-表示 使…变成,分开,离开
    32dia-表示 穿过,二者之间
    33dif-和辅音重复表示 不,否定,分开
    34dis-表示 不,消失掉
    35dis-表示 分开,分离
    36dys-表示 坏,不良
    37e-, ef-表示 出,出来,
    38em-, en-表示 进入… 之中,包围
    39em-,en-表示 使… 进入状态
    40endo-表示 内部
    41epi-表示 在…上,在…周围,在…后面
    42eu-表示 好,优秀
    43ex-表示 出,出去
    44ex-表示 前面的,前任的
    45exo-表示 外部的,外面
    46extra-表示 以外的,超过的
    47fore-表示 前面,预先
    48hecto-表示 百,许多
    49hemi-表示 半
    50hepta-表示 七
    51hetero-表示 异类,异种
    52hexa-表示 六
    53holo-表示 全部
    54homo-表示 同类的
    55hyper-表示 超过,太多
    56hypo-表示 下面,次等
    57il-, ir-辅音重复表示 不,无
    58il-,ir-表示 使…成为,进入
    59im-, in-表示 不,无,非
    60im-,in-表示 向内,进入
    61inter-表示 在… 之间,相互
    62intra-表示 在内,内部
    63intro-表示 向内,入内
    64iso-表示 等, 同
    65kilo-表示 一千
    66macro-表示 宏传, 大
    67mal-; male表示 坏,恶
    68meta-表示 超过, 改变
    69micro-表示 微,小
    70milli-表示 千,千分之一
    71mini-表示 小
    72mis-表示 错误,坏
    73mono-表示 单个,一个
    74mono-表示 单个,一个
    75neo-表示 新的
    76non-表示 不,非
    77ob-表示 逆,倒,加强意义
    78octa-表示 八 ; 亦作octo
    79omni-表示 全部,到处
    80out-示 超过,过度
    81out-表示 出去,过时
    82over-表示 过度,过份
    83over-表示 翻转
    84over-表示 在… 之上
    85paleo-表示 古,旧
    86pan-表示 广泛的
    87para-表示 半,类似,辅助
    88para-表示 旁边
    89para-表示 降落伞
    90pen-表示 近似,差不多
    91penta-表示 五
    92per-表示 贯穿,自始至终
    93per-表示 假,坏
    94peri-表示 周围,靠近
    95poly-表示 多
    96post-表示 在后面
    97post-表示 邮件,邮政
    98pre-表示 …前的,预先
    99pro-表示 赞同,亲…
    100pro-表示 向前,在前
    101pro-表示 很多…
    102proto-表示 原始…
    103pseudo-表示 假,伪
    104quadri-,quadru-表示 四
    105quasi-表示 类似,准
    106re-表示 向后,相反
    107re-表示 一再,重新
    108retro-表示 向后,倒退
    109se-表示 分开,离开,区别开
    110semi-表示 半
    111sept-,septi-表示 七
    112sex-, sexi-表示 六
    113step-表示 后,继或前夫(妻)所生
    114stereo-表示 立体
    115sub-表示 在下面,次一等,副手
    116sub-表示 接近,靠近
    117suc-, suf-, sup-, sur-等辅音重复表示 在…下面
    118super-表示 在…上面
    119super-表示 超级,超过,过度
    120supra-表示 超…
    121sur-辅音不重复表示 超过,在上面
    122sus-表示 在… 下面
    123sym-, syn-表示 共同,相同
    124tetra-表示 四
    125trans-表示 横过,越过
    126trans-表示 变换,改变’;转移
    127tri-表示 三
    128twi-表示 二、两
    129ultra-表示 极端
    130ultra-表示 超出,超过
    131un-表示 不,无,非,没有
    132un-表示 打开,解开,弄出
    133under-表示 在…下,在…之内
    134under-表示 不足,不够
    135under-表示 副手 3
    136uni-表示 一个、单一
    137vice-表示 副
    138with-表示 向后,相反

    常用前缀

    常用个屁,全部前缀也不过才138个,138个前缀都想摸鱼,怎么记成千上万个单词?

    展开全文
  • Golang 实现 Trie (前缀树)

    千次阅读 2019-03-31 00:25:42
    前缀树是N叉树的一种特殊形式。通常来说,一个前缀树是用来存储字符串的。前缀树的每一个节点代表一个字符串(前缀)。每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由...

    定义

    前缀树是N叉树的一种特殊形式。通常来说,一个前缀树是用来存储字符串的。前缀树的每一个节点代表一个字符串(前缀)。每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由节点本身的原始字符串,以及通往该子节点路径上所有的字符组成的。

    下面是前缀树的一个例子:
    在这里插入图片描述
    在上图示例中,我们在节点中标记的值是该节点对应表示的字符串。例如,我们从根节点开始,选择第二条路径 ‘b’,然后选择它的第一个子节点 ‘a’,接下来继续选择子节点 ‘d’,我们最终会到达叶节点 “bad”。节点的值是由从根节点开始,与其经过的路径中的字符按顺序形成的。

    值得注意的是,根节点表示空字符串。

    前缀树的一个重要的特性是,节点所有的后代都与该节点相关的字符串有着共同的前缀。这就是前缀树名称的由来。

    我们再来看这个例子。例如,以节点 “b” 为根的子树中的节点表示的字符串,都具有共同的前缀 “b”。反之亦然,具有公共前缀 “b” 的字符串,全部位于以 “b” 为根的子树中,并且具有不同前缀的字符串来自不同的分支。

    前缀树有着广泛的应用,例如自动补全,拼写检查等等。我们将在后面的章节中介绍实际应用场景。

    问题描述

    实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

    示例:

    Trie trie = new Trie();
    
    trie.insert("apple");
    trie.search("apple");   // 返回 true
    trie.search("app");     // 返回 false
    trie.startsWith("app"); // 返回 true
    trie.insert("app");   
    trie.search("app");     // 返回 true
    

    说明:

    你可以假设所有的输入都是由小写字母 a-z 构成的。
    保证所有输入均为非空字符串。

    实现思路:

    1. 由于所有输入都是小写字母构成,可以用桶的方式实现,虽然有空间浪费,但是速度最快。
    2. 同时要实现搜索词和搜索词前缀。考虑加入布尔标识是否是一个词。但插入词的时候,到词的最后一个字母时,将该节点布尔设为true

    代码:

    type Trie struct {
    	isWord   bool
    	children [26]*Trie
    }
    
    /** Initialize your data structure here. */
    func Constructor() Trie {
    	return Trie{}
    }
    
    /** Inserts a word into the trie. */
    func (this *Trie) Insert(word string) {
    	cur := this
    	for i, c := range word {
    		n := c - 'a'
    
    		if cur.children[n] == nil {
    			cur.children[n] = &Trie{}
    
    		}
    		cur = cur.children[n]
    		if i == len(word)-1 {
    			cur.isWord = true
    		}
    
    	}
    }
    
    /** Returns if the word is in the trie. */
    func (this *Trie) Search(word string) bool {
    	cur := this
    	for _, c := range word {
    		n := c - 'a'
    		if cur.children[n] == nil {
    			return false
    		}
    		cur = cur.children[n]
    	}
    	return cur.isWord
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    func (this *Trie) StartsWith(prefix string) bool {
    	cur := this
    	for _, c := range prefix {
    		n := c - 'a'
    		if cur.children[n] == nil {
    			return false
    		}
    		cur = cur.children[n]
    	}
    	return true
    }
    
    /**
     * Your Trie object will be instantiated and called as such:
     * obj := Constructor();
     * obj.Insert(word);
     * param_2 := obj.Search(word);
     * param_3 := obj.StartsWith(prefix);
     */
    
    展开全文
  • 通过Javascript语言实现的前缀树,包括前缀树的构造,以及检索
  • Tri树 统计难题

    2018-08-15 16:23:01
    struct node //定义结构体表示Tri树上的节点 { node* next[27]; //子节点 int v; //记录当前节点是几个单词的前缀 }; node root; node *newnode() //新建一个节点 { node * temp=new node; temp->v=1; for ...
  • 前缀

    2019-02-09 23:09:10
    前缀篇 受影响变形后 同意前缀   AB 3 分离,远离,消失,intensive表加强 重要包含同义词根 abs 3 c,t前变形   a 3 m,v前变形   AD 15 to,向,朝向,add...
  • verilog 综合注意事项

    万次阅读 多人点赞 2016-07-29 15:46:40
    verilog
  • 英语单词前缀大全

    千次阅读 2020-11-02 17:42:11
    当掌握了前缀,后缀,词根,和基础名词以后,你就能认识百分之九十的单词了。 文章目录1. a①加在单词或词根前面,表示“不,无,非”②加在单词前,表示“在...的”2. ab-, abs- 加在词根前面,表示“相反,变坏,...
  • 前缀整理

    2020-07-04 12:16:45
    表示“无,不,否定” a- asymmetry 不对称的 an- anarchism 无政府主义 de- demilitarize 非军事化 dif- diffident 自卑的 dis- disproof 反驳 e- efface ...
  • Trie这个术语来自于retrieval,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”。Trie树典型应用是用于快速检索(最长前缀匹配),统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计,搜索...
  • 前缀61

    2019-03-03 23:28:04
    amphicar水陆两用车 75.tri-表示”三“ triangle 三角形 delta三角形(angle 角) rectangle矩形 triple 三倍的 tripod三角架(pod角) pod=ped=foot 76.kilo-表示“一千” kilograme公斤(gram 克) kilometer公里...
  • 前缀+词根+后缀

    2018-01-17 17:02:00
    英语单词的构词规律也是有规可寻...词素又是由词根和词缀两部分组成的,而词缀又分为前缀和后缀。 常用的252个词根和289个词缀,掌握了这些词素便可掌握绝大部分英语词汇。词根的定义是什么?词根是一个单词的根本...
  • 引言 前缀树——trie 树,也叫作“单词查找树”、“字典树”。 它属于多叉树结构,典型应用场景是统计
  • 本博文源于刘洪波老师的《英文字根词源精讲》包含单词前缀dia/dis/duo/en/epi/eu/ex/extra/fore/forth/homo/hyper/hypo/in/inter/kilo/macro等前缀非常精彩!
  • 这是胡敏老师编辑的那本考研英语核心词汇笔记,现在只是...英语常用前缀: aero-:空气(的),大气(的),飞机(的),航空(的);例子:plane,space anti-:反,抗,阻,非nuclear,matter,war,anxiety,ba
  • 英语单词前缀规则总结

    千次阅读 2015-02-15 14:22:00
    superword是一个Java实现的英文单词分析软件,主要研究英语单词音近形似转化规律、前缀后缀规律、词之间的相似性规律等等。 1、A- (not, without) (hit 87) 1、 Adam 2、 Alex 3、 aback 4、 aboard 5、 a...
  • C++ 前缀

    2020-07-23 21:27:49
    参考左神前缀树写法。 每个结点包括 通过的路径数量(每个字符出现的数量) 停止点(至此前的字符串出现的数量) 接下来的字符 主要函数包括 插入字符串 word_insert 返回相同的字符串数量 word_search...struct Tri
  • 题目链接 LeetCode 208. 实现 Trie (前缀树)[1] 题目描述 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。 示例1 Trie tri...
  • 前缀 表示(一般情况) con- = com- = cor- = col- =co- 在一起,共同,强调 un- = in- = im- 否定 de- = di- = dis- = is- 分,分离,失去,否定,向下 mis- 错误 e- = ex- = e??(??指双写辅音字母) 向...
  • 【JZOJ3446】三角阵(tri)

    2018-06-05 19:33:44
    problem Description 把3个相同的小三角形按如下方式连接起来就形成了一个一级三角...我们为顶端的三角阵的标记添加前缀T,为左端的三角阵的标记添加前缀L,为右端的三角阵的标记添加前缀R。 把3个二级三角阵按同...
  • TrieTree 前缀

    2020-04-01 12:29:32
    前缀树:理论知识不做赘述,直接看代码 1-Node节点、 树是由一个个节点组件而来,那前缀树的节点应该包含哪些基本信息呢: a-以当前节点作为末尾节点的次数 b-以当前节点作为中间节点的次数 ... Tri...
  • 英语前缀简记

    千次阅读 2018-06-01 14:45:49
    作为程序员,不懂英语真是坑QAQ前缀+词根+后缀前缀顶方向(上下、里外等),前缀的含义一般都两个以上,词根定含义,后缀定词性前缀上面a=e=i=u1. super(1) 超级supersize超级+尺寸=超大型的 superpower 超级+力量...
  • a:表示否定 anti:表示相反 auto:表示自动自己 bi:表示两个 co:表示共同 ...表示再 semi:表示半 sub:表示靠近,次等的 super:表示超级 tri:表示数量词三 ultra:表示超,程度深 un:表示相反 under:表示在…下
  • Trie(字典树、前缀树)

    2020-07-09 15:15:57
    文章目录什么是Trie?创建一棵Trie向Trie中添加元素Trie的查询操作对比二分搜索树和Trie的性能leetcode上的问题 什么是Trie?   Trie是一个多叉树,Trie专门为处理字符串而设计的。使用我们之前实现的二分...  Tri
  • Tire-Tree(前缀树,字典树)

    千次阅读 2017-08-17 13:28:21
    在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,...
  • 英语单词最常用的328个前缀后缀(超全面)

    万次阅读 多人点赞 2016-06-29 11:22:05
     127 tri- 表示 三  128 twi- 表示 二、两  129 ultra- 表示 极端  130 ultra- 表示 超出,超过  131 un- 表示 不,无,非,没有  132 un- 表示 打开,解开,弄出  133 under-...
  • 同音不同义8 数字前缀 接下来,我们将要继续学习大约130个单词,一起来吧! 1.回顾 在之前的一讲中,我们主要学习了以义项为基础的多义词解释问题,事实上,多义词都是以核心的意思为基础,在不同的上下文中的不同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,389
精华内容 555
关键字:

tri前缀