一晚上, 写代码用了部分时间,其他时间就浪费在一个getchar()上了,小失误大问题啊啊!!!!!!!!!!
这道题的题意很简单,就是字典树的创建和查找,很快完成了,刚开始一提交,一个数组开小了,提示RunTime Error,于是将字典的词数扩大到一百万,这时候问题出现了,PE,显示出错,后来加了个getchar()解决。附代码:
10299505 | 2014-03-14 21:23:59 | Accepted | 1075 | 281MS | 67892K | 2919 B | C++ | 天涯路 |
#include<cstdio>
#include<cstdlib>
#include<string>
#include<iostream>
using namespace std;
typedef struct Tire
{
int final;
struct Tire *next[26];
}Tire;
//创建一个头节点
int flag=0;
char e_word[1000000][12];
char s[12];
char line[3100];
char temp[12];
void creat_tire(char s[],int final_num,Tire *head)
{
Tire *p1;
Tire *p2;
p1=head;
for(int i=0;s[i]!='\0';i++)
{
int k=s[i]-97;
if(p1->next[k]==NULL)
{
p2=(Tire *)malloc(sizeof(Tire));
p2->final=0;
for(int j=0;j<26;j++)
p2->next[j]=NULL;
p1->next[k]=p2;
p1=p2;
}
else
p1=p1->next[k];
}
p1->final=final_num;
}
//find 查找字典树,如果存在就输出,否则就打印原来的
void find(char temp[],int size, Tire *head)
{
Tire *p1;
//Tire *p2;
p1=head;
int flag_find=1;
for(int i=0;temp[i]!='\0';i++)
{
int k=temp[i]-97;
if(p1->next[k]==NULL)
{
flag_find=0;
break;
}
else
p1=p1->next[k];
}
if(flag_find==0)
printf("%s",temp);
else
{
if(p1->final==0)
printf("%s",temp);
else
{
int find_num=p1->final;
printf("%s",e_word[find_num]);
}
}
// cout<<11111<<endl;
}
void io_handle(Tire *head)//处理输入问题
{
int num=-1;
int final_num=0;
memset(s,'\0',sizeof(s));
memset(e_word,'\0',sizeof(e_word));
while(scanf("%s",s)!=EOF)
{
num++;
if(s[0]=='S')
{
memset(s,'\0',sizeof(s));
continue;
}
if(s[0]=='E')
{
memset(s,'\0',sizeof(s));
num=0;
break;
}
if(num%2==1)//输入为英语单词
{
final_num=num/2+1;
for(int i=0;s[i]!='\0';i++)
e_word[final_num][i]=s[i];
}
else//输入为火星文
{
creat_tire(s,final_num,head);
}
memset(s,'\0',sizeof(s));
}//first_while
memset(line,'\0',sizeof(line));
int cnt=0;
getchar();//问题出现的地方
while(gets(line))
{
cnt++;
if(line[0]=='S')
{
memset(line,'\0',sizeof(line));
continue;
}
if(line[0]=='E')
{
memset(line,'\0',sizeof(line));
break;
}
int i=-1;
int tmp=-1;
while(line[++i]!='\0')
{
if(line[i]>=97 && line[i]<=122)
{
flag=1;
temp[++tmp]=line[i];
}
else
{
if(flag==1)
{
find(temp,tmp+1,head);
printf("%c",line[i]);
flag=0;
tmp=-1;
memset(temp,'\0',sizeof(temp));
}
else
printf("%c",line[i]);
}//else
}
if(flag==1)
{
find(temp,tmp+1,head);
//printf("%c",line[i]);
flag=0;
tmp=-1;
memset(temp,'\0',sizeof(temp));
}
// if(cnt>0)
printf("\n");
}//second while
}
int main()
{
Tire *head=NULL;
head=(Tire *)malloc(sizeof(Tire));
head->final=0;
for(int i=0;i<26;i++)
head->next[i]=NULL;
io_handle(head);
return 0;
}