使用二分肯定超时了。
map做法:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <map>
using namespace std;
const int N = 3005;
char s[N];
map<string,string> f;
int main()
{
string x;
cin >> x;
while(cin >> x && x != "END")
{
string y;
cin >> y;
f[y] = x;
}
cin >> x;
getchar();
while(gets(s))
{
if(s[0] == 'E')
break;
int len = strlen(s);
string t = "";
for(int i = 0;i < len;++i)
{
if(s[i] >= 'a' && s[i] <= 'z')
t += s[i];
else
{
string temp = f[t];
if(temp != "")
cout << temp;
else
cout << t;
printf("%c",s[i]);
t = "";
}
}
if(t != "")
{
if(f[t] != "")
cout << f[t];
else
cout << t;
}
printf("\n");
}
return 0;
}
#include <cstdio>
#include <cstring>
const int MaxLen = 3010;
const int MaxSize = 26;
struct Node{ //字典树结点
char* val; //结点值
Node* next[MaxSize]; //结点的孩子结点
};
struct Trie{ //字典树定义
Node* root;
int idx(char c) //返回字符编号
{
return c - 'a';
}
Trie(){ //构造函数申请字典树根节点
root = newNode();
}
void init() //初始化字典树
{
del(root);
root = newNode();
}
Node* newNode() //初始化字典树结点
{
Node* u = new Node();
u -> val = NULL;
for(int i = 0; i < MaxSize;++i)
u -> next[i] = NULL;
return u;
}
void insert_node(char* s,char* v) //插入结点
{
Node* u = root;
int len = strlen(s);
for(int i = 0;i < len;++i)
{
int c = idx(s[i]);
if(u -> next[c] == NULL) // 如果没有这个结点
u -> next[c] = newNode(); //申请
u = u -> next[c]; //往下走
}
u -> val = new char[11]; //申请一下值结点内存,不用值就不用申请
strcpy(u -> val,v);
}
void search_node(char* s) //寻找结点
{
Node* u = root;
int n = strlen(s);
for(int i = 0;i < n;++i)
{
int c = idx(s[i]);
if(u -> next[c] == NULL) //如果当中的某个结点是空的,查找失败了
{
printf("%s",s);
return ;
}
u = u -> next[c];
}
if(u -> val != NULL) // 如果这个结点有值。
printf("%s",u -> val);
else
printf("%s",s);
}
void del(Node* rt)
{
if(rt == NULL)
return ;
else
{
for(int i = 0;i < MaxSize;++i)
if(rt -> next[i])
del(rt -> next[i]);
}
delete rt -> val;
delete rt;
}
}trie;
char english[11],mars[11];
char m[MaxLen],t[MaxLen];
int main()
{
scanf("%s",english);
while(scanf("%s",english) && strcmp(english,"END"))
{
scanf("%s",mars);
trie.insert_node(mars,english);
}
scanf("%s",english);
getchar();
int g = 0;
while(gets(m) && strcmp(m,"END"))
{
int len = strlen(m);
for(int i = 0;i < len;++i)
{
if(m[i] >= 'a' && m[i] <= 'z')
t[g++] = m[i];
else
{
t[g] = '\0';
trie.search_node(t);
printf("%c",m[i]);
g = 0;
}
}
printf("\n");
}
}
大数组版本
#include <cstdio>
#include <cstring>
char start[30];
char english[30];
char mars[30];
int ch[1000005][30];
char val[1000005][30];
int vis[1000005];
int sz;
char m[3005];
int idx(char c)
{
return c - 'a';
}
void insert_node(char s[] , char v[])
{
int u = 0;
int n = strlen(s);
for(int i = 0; i < n;++i)
{
int c = idx(s[i]);
if(!ch[u][c])
{
//memset(ch[sz],0,sizeof(sz));
ch[u][c] = sz++;
}
u = ch[u][c];
}
vis[u] = 1;
strcpy(val[u],v);
}
int search_node(char s[])
{
int u = 0;
int n = strlen(s);
for(int i = 0 ; i < n;++i)
{
int c = idx(s[i]);
if(!ch[u][c])
return -1;
u = ch[u][c];
}
if(!vis[u]) return -1;
return u;
}
int main()
{
sz = 1;
memset(ch,0,sizeof(ch));
memset(val,0,sizeof(val));
memset(vis,0,sizeof(vis));
scanf("%s",start);
while(scanf("%s",english) && english[0] != 'E')
{
scanf("%s",mars);
insert_node(mars,english);
}
/*for(int i = 0;i < sz;++i)
if(vis[i])
printf("结点%d 的值为%s\n",i,val[i]);*/
scanf("%s",start);
getchar();
int g = 0;
while(gets(m) && m[0] != 'E')
{
int len = strlen(m);
for(int i = 0;i < len;++i)
{
if(m[i] >= 'a' && m[i] <= 'z')
mars[g++] = m[i];
else
{
mars[g] = '\0';
int f = search_node(mars);
if(f != -1)
printf("%s",val[f]);
else printf("%s",mars);
printf("%c",m[i]);
g = 0;
}
}
if(g)
{
mars[g] = '\0';
int f = search_node(mars);
if(f != -1)
printf("%s",val[f]);
else printf("%s",mars);
g = 0;
}
printf("\n");
}
return 0;
}