USACO 2.3.1 Longest Prefix --- Trie

本文详细介绍了一种高效的数据结构——前缀树(Trie),并提供了使用C++实现的完整代码示例。通过前缀树,可以有效地进行字符串匹配和搜索操作,特别适用于字典或文本处理等场景。
View Code
  1 /*
  2 PROG:   prefix
  3 ID  :   ouyangyewei
  4 LANG:   C++
  5 */
  6 #include <string.h>
  7 #include <cstdio>
  8 #include <cstdlib>
  9 #include <cstring>
 10 #include <iostream>
 11 #include <memory.h>
 12 #include <algorithm>
 13 using namespace std;
 14 
 15 struct Trie_Node
 16 {
 17     bool IsEnd;
 18     Trie_Node *branch[26];
 19     Trie_Node(): IsEnd( false )
 20     {
 21         memset( branch, 0, sizeof(branch) );
 22     }// Init
 23 };
 24 
 25 class Trie
 26 {    
 27     public:
 28         Trie();
 29         void Trie_Insert( char tt[] );
 30         void Trie_Find( long j );
 31     
 32     private:
 33         Trie_Node *root;
 34 }t; // type class "Trie" object t
 35 
 36 long slen;
 37 bool prefix[200400];
 38 char line[204], ss[200400];
 39 
 40 Trie::Trie()
 41 {
 42     root = new Trie_Node();
 43 }// Trie
 44 
 45 void Trie::Trie_Insert( char tt[] )
 46 {
 47     Trie_Node *ptr = root;
 48     int tlen = strlen( tt );
 49     for ( int i=0; i<tlen; ++i )
 50     {
 51         if ( ptr->branch[ tt[i]-'A' ]==NULL )
 52         {
 53             Trie_Node *tmp = new Trie_Node();
 54             ptr->branch[ tt[i]-'A' ] = tmp;
 55         }
 56                         
 57         ptr = ptr->branch[ tt[i]-'A' ];
 58     }
 59                     
 60     ptr->IsEnd = true;
 61 }// Trie_Insert
 62 
 63 void ReadData()
 64 {    
 65     while ( gets( line ) )
 66     {
 67         if ( line[0]=='.' ) break;
 68         
 69         char *tok = strtok( line, " " );
 70         while ( tok )
 71         {
 72             t.Trie_Insert( tok );
 73             //printf("%s\n", tok);
 74             tok = strtok( NULL, " " );
 75         }// Insert
 76     }
 77     
 78     char str[204];
 79     while ( gets( str ) )
 80     {
 81         strcat( ss, str );
 82     }
 83     
 84     slen = strlen( ss );
 85     
 86     return ;
 87 }// ReadData
 88 
 89 void Trie::Trie_Find( long j )
 90 {
 91     Trie_Node *ptr = root;
 92     for ( ; ; ++j )
 93     {
 94         ptr = ptr->branch[ ss[j]-'A' ];
 95         if ( ss[j]=='\0' || ptr==NULL )
 96             return ;
 97         if ( ptr->IsEnd )
 98             prefix[ j+1 ]=true;
 99     }
100     
101     return ;
102 }// Trie_Find
103 
104 void Solve()
105 {
106     prefix[0] = true;
107     for ( long i=0; i<slen; ++i )
108     {
109         if ( !prefix[i] )   continue;
110         
111         t.Trie_Find( i );
112     }// Searching
113     
114     int result;
115     for ( result=slen; !prefix[result]; --result );
116     printf("%d\n", result);
117 
118     return ;
119 }// Solve
120 
121 int main()
122 {
123     freopen("prefix.in", "r", stdin);
124     freopen("prefix.out", "w", stdout);
125 
126     ReadData();
127     Solve();
128     
129 //    system("pause");
130     return 0;
131 }

转载于:https://www.cnblogs.com/yewei/archive/2012/08/06/2625745.html

AI-PPT 一键生成 PPT:用户输入主题关键词,AI-PPT 可快速生成完整 PPT,涵盖标题、正文、段落结构等,还支持对话式生成,用户可在 AI 交互窗口边查看边修改。 文档导入转 PPT:支持导入 Word、Excel、PDF 等多种格式文档,自动解析文档结构,将其转换为结构清晰、排版规范的 PPT,有保持原文和智能优化两种模式。 AI-PPT 对话 实时问答:用户上传 PPT 或 PPTX 文件后,可针对演示内容进行提问,AI 实时提供解答,帮助用户快速理解内容。 多角度内容分析:对 PPT 内容进行多角度分析,提供全面视野,帮助用户更好地把握内容结构和重点。 多语言对话支持:支持多语言对话,打破语言障碍,方便不同语言背景的用户使用。 AI - 绘图 文生图:用户输入文字描述,即可生成符合语义的不同风格图像,如油画、水彩、中国画等,支持中英文双语输入。 图生图:用户上传图片并输入描述,AI - 绘图能够根据参考图和描述生成新的风格化图像,适用于需要特定风格或元素的创作需求。 图像编辑:提供如 AI 超清、AI 扩图、AI 无痕消除等功能,用户可以上传图片进行细节修改和优化,提升图片质量。 AI - 文稿 文案生成:能够根据用户需求生成多种类型的文章,如市场营销文案、技术文档、内部沟通内容等,提升文案质量和创作效率。 文章润色:对已有文章进行改善和优化,包括语言表达、逻辑连贯性、内容流畅度等方面,使文章更符合用户期望和风格。 文章续写:AI 技术理解文本语境,为用户提供新的想法、补充资料或更深层次的见解,帮助用户丰富文档内容。 AI - 医生 智能健康咨询:包括症状自查,用户输入不适症状,AI 结合病史等信息提供疾病可能性分析与初步建议;用药指导,支持查询药品适应症、禁忌症等,并预警潜在冲突;中医辨证,提供体质辨识与调理建议。 医学报告解读:用户上传体检报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值