最基本的字典树。
可以用map做,但是效率好低啊。。。
学到了一些东西,比如:
1、strncpy(s,a,len)函数是把从指针a开始的len个字符赋给s。
(我开始是一个一个赋值的然后tle了。。用这个函数就只需找到空格然后分别把
两个词赋给相应的变量就行了)
2、map<string,string> mp中两个关键字的类型虽然能用 char * ,但是最好写string。
因为很神奇的是:
插入新值对时,如果是用相同的变量存的,只是变量中值改变,mp的计数不会加1。
而用string就没有这种困扰。可能是因为string是变长数组的原因吧。
int main()
{
map<char*,char*> mp;
char s1[20],s2[20],s3[20],s4[20];
strcpy(s1,"yes"),strcpy(s2,"apple");
mp[s1] = s2;
cout<<mp.size()<<endl;
strcpy(s1,"dg"),strcpy(s2,"map");
mp[s1] = s2;
cout<<mp.size()<<endl;
}
输出为:1
1
<span style="font-size:14px;">int main()
{
map<string,string> mp;
string s1,s2;
s1 = "yes",s2 = "apple";
mp[s1] = s2;
cout<<mp.size()<<endl;
s1 = "dg",s2 ="map";
mp[s1] = s2;
cout<<mp.size()<<endl;
return 0;
}</span>
输出为:1
2
3、用map找关键字时直接用find函数,如果iter = find(a),iter!=mp.end()则存在。
这个比遍历快得多,也是map的优势所在。
4、字符串后面有结束标志'\0'。
5、字典树建树时关于 根节点指针的引用。
指针和引用的区别:引用是改变 本身,而指针是创建副本再改变再回传。
6、一维数组传参可以传char *a,也可以传char a[]。
map实现:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
map<string,string> mp;
typedef pair<string,string> pii;
int main()
{
char s1[10],s2[10];
char s[30];
mp.clear();
while(gets(s))
{
int len = strlen(s);
if(len == 0) break;
int i;
for(i=0;s[i]!=' ';i++);
strncpy(s1,s,i);
strncpy(s2,s+i+1,len-i-1);
s1[i] = '\0';
s2[len-i-1] ='\0';
mp[s2] = s1;
}
while(scanf("%s",s1)!=EOF)
{
map<string,string>::iterator iter;
iter = mp.find(s1);
if(iter!=mp.end())
cout<<iter->second<<endl;
else cout<<"eh"<<endl;
}
return 0;
}
字典树Trie
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define maxn 100010
#define MX 26
using namespace std;
struct node
{
char s[20];
struct node *next[MX];
int v;
}trie;
void init(node* &rt)
{
rt = (node*)malloc(sizeof(node));
rt->v = 0;
for(int i=0;i<26;i++)
rt->next[i] = NULL;
}
void insert(char *path,char *s,node *rt)
{
int l = strlen(path);
for(int i=0;i<l;i++)
{
if(rt->next[path[i]-'a']==NULL)
{
node *t = (node *)malloc(sizeof(node));
for(int j=0;j<26;j++)
t->next[j] = NULL;
t->v = 0;
rt->next[path[i]-'a'] = t;
}
rt = rt->next[path[i]-'a'];
}
rt->v = 1;
strcpy(rt->s,s);
}
void find(char *s,node* rt)
{
int len = strlen(s);
for(int i=0;i<len;i++)
{
if(rt->next[s[i]-'a']!=NULL)
rt = rt->next[s[i]-'a'];
else break;
}
if(rt->v == 1)
puts(rt->s);
else puts("eh");
}
int main()
{
char str[30];
char a[20],b[20];
node *rt;
init(rt);
while(gets(str))
{
int len = strlen(str);
if(len==0) break;
int i;
for(i=0;str[i]!=' ';i++);
strncpy(a,str,i);
strncpy(b,str+i+1,len-i-1);
a[i+1] ='\0';
b[len-i-1] = '\0';
insert(b,a,rt);
}
while(scanf("%s",a)!=EOF)
find(a,rt);
return 0;
}