这两天做题,加深对之前所学知识点的理解。当时看的时候,觉得字典树难,现在看起来还挺简单的。
POJ 2503 Babelfish 给出两种语言的对应表,通过给出某种语言的一个单词,得出另一种语言中所对应的该单词。
之前做过这道题,直接用map就可以了。也可以用字典树,在建树的过程中,在字典树节点中存入另一种语言的字符串,val数组表示的是是否为单词的末字母。
应该注意的是怎么控制输入,sscanf函数的应用。
#include<iostream>
#include<string>
#include<cstdio>
#include<map>
using namespace std;
int main()
{
string s;
char ss[100],s1[100],s2[100];
int x,y;
map<string,string>m;
map<string,string>::iterator p;
while (gets(ss))
{
s=ss;
if(s=="")break;
else
{
sscanf(s.c_str(),"%s %s",s1,s2);
m[s2]=s1;
}
}
while(gets(ss))
{
s=ss;
p=m.find(s);//从映照容器中查找键值
if(p!=m.end())
cout<<m[s]<<endl;
else
cout<<"eh"<<endl;
}
return 0;
}
HDU 1671 Phone List+POJ 1056 IMMEDIATEDECODABILITY 一样的题
集合中是否有一个字符串是其他字符串的前缀。
val[u]代表的是u是否为某一单词的末尾字母。在建树时判断是否有当前串的前缀单词,或者以插入串为前缀的长串。
#include<bits/stdc++.h>
using namespace std;
const int N=110000;
const int M=11;
struct Teir
{
int ch[N][M];
int val[N];
int sz;
void Clear()
{
sz=1;
//val[0]=0;
memset(ch,0,sizeof(ch));
}
int idx(char ch)
{
return ch-'0';
}
bool Insert(char *s)
{
bool f=1;
int u=0,n=strlen(s);
for(int i=0;i<n;i++)
{
int id=idx(s[i]);
if(ch[u][id]==0)
{
ch[u][id]=sz;
val[sz]=0;
memset(ch[sz],0,sizeof(ch[sz]));
sz++;
}
u=ch[u][id];
if(val[u]>0)//存在当前插入串的前缀
f=0;
}
val[u]=1;
if(f)
{
for(int i=0;i<11;i++)
{
if(ch[u][i]!=0)//存在当前包含插入串的长串
{
f=0;
break;
}
}
}
return f;
}
}teir;
char word[21];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
teir.Clear();
bool f=1;
for(int i=0;i<n;i++)
{
scanf("%s",word);
if(f)
f=teir.Insert(word);
}
if(f)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=110000;
const int M=11;
struct Teir
{
int ch[N][M];
int val[N];
int sz;
void Clear()
{
sz=1;
//val[0]=0;
memset(ch,0,sizeof(ch));
}
int idx(char ch)
{
return ch-'0';
}
bool Insert(char *s)
{
bool f=1;
int u=0,n=strlen(s);
for(int i=0;i<n;i++)
{
int id=idx(s[i]);
if(ch[u][id]==0)
{
ch[u][id]=sz;
val[sz]=0;
memset(ch[sz],0,sizeof(ch[sz]));
sz++;
}
u=ch[u][id];
if(val[u]>0)//存在当前插入串的前缀
f=0;
}
val[u]=1;
if(f)
{
for(int i=0;i<11;i++)
{
if(ch[u][i]!=0)//存在当前包含插入串的长串
{
f=0;
break;
}
}
}
return f;
}
}teir;
char word[21];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
teir.Clear();
bool f=1;
for(int i=0;i<n;i++)
{
scanf("%s",word);
if(f)
f=teir.Insert(word);
}
if(f)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}