<pre name="code" class="cpp">///尼玛这真的是模板咩、、、
///字符串处理还是要多练习的。。。
//
//题意:给你字符串以及它的映射,提问任意一个映射它真实的字符串是什么
//注意所求的字符串只是某个字符串的前缀情况~~
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct Trie_node
{
int count; // 统计单词前缀出现的次数
struct Trie_node* next[26]; // 指向各个子树的指针
bool exist; // 标记该结点处是否构成单词
char trans[25]; // 翻译
}TrieNode , *Trie;
TrieNode* createTrieNode()
{
TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode));
node->count = 0;
node->exist = false;
memset(node->next , 0 , sizeof(node->next)); // 初始化为空指针
return node;
}
void Trie_insert(Trie root, char* word , char* trans)
{
Trie node = root;
char *p = word;
int id;
while( *p )
{
id = *p - 'a';
if(node->next[id] == NULL)
{
node->next[id] = createTrieNode();
}
node = node->next[id]; // 每插入一步,相当于有一个新串经过,指针向下移动
++p;
node->count += 1; // 这行代码用于统计每个单词前缀出现的次数(也包括统计每个单词出现的次数)
}
node->exist = true; // 单词结束的地方标记此处可以构成一个单词
strcpy(node->trans , trans);
}
char* Trie_search(Trie root, char* word)
{
Trie node = root;
char *p = word;
int id;
while( *p )
{
id = *p - 'a';
node = node->next[id];
++p;
if(node == NULL)
return 0;
}
if(node->exist) // 查找成功
return node->trans;
else // 查找失败
return NULL;
}
int main()
{
char str[3005];char *p;
char str1[3005],str2[3005];char str3[3005];
Trie root=createTrieNode();
scanf("%s",str);
while(scanf("%s",str1))
{
if(strcmp(str1,"END")==0)
break;
else
{
scanf("%s",str2);
//cout<<str2<<" "<<str1<<endl;
Trie_insert(root,str2,str1);
}
}
getchar();
gets(str);
int k=0;
char c;
while(gets(str1))
{
k=0;
if(strcmp(str1,"END")==0)
break;
// cout<<str1<<endl;
for(int i=0;str1[i]!='\0';i++)
{
c=str1[i];
if(c>='a'&&c<='z')
str3[k++]=c;
else
{
str3[k]='\0';
p=Trie_search(root,str3);
if(p)
cout<<p;
else
cout<<str3;
k=0;
cout<<c;
}
}
cout<<endl;
}
}
HDU 1075 字典树
最新推荐文章于 2019-01-10 21:49:00 发布