hdu 1075 What Are You Talking About

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1075


。。字典树。。带着模版打了一个小时。。

悲剧。。各种细节不注意。。

以后还是少用sscanf()。。毕竟它的用法记得不太全面。

下面是用数组模拟的字典树AC代码:


#include<iostream>
using namespace std;
struct node
{
	char english[20];
	int next[26];
	int f;
	void init()
	{
		memset(next,-1,sizeof(next));
		f=0;
	}
}trie[1000000];
int p;
void root()
{
	trie[0].init();
}
void updata(char *a,char *s)
{
	int index=0;
	int lenb=strlen(s);
	int cur,i;
	for(i=0;i<lenb;i++)
	{
		cur=s[i]-'a';
		if(trie[index].next[cur]==-1)
		{
			trie[++p].init();
			trie[index].next[cur]=p;
		}
		index=trie[index].next[cur];
	}

	strcpy(trie[index].english,a);
	trie[index].f=1;
}

void find(char *s)
{
	int index=0;
	int len=strlen(s);
	int cur,i;
	int flag=1;
	for(i=0;i<len;i++)
	{
		cur=s[i]-'a';
		if(trie[index].next[cur]==-1)
		{
			flag=0;
			break;
		}
		index=trie[index].next[cur];
	}
	if(flag&&trie[index].f)
		 printf("%s",trie[index].english);
	else
		printf("%s",s);	   
}
int main()
{
	char start[10],input1[100],input2[100];
	char input[3000];
	    root();
		scanf("%s",start);
	//	getchar();
		while(1)
		{
			scanf("%s",input1);
	
			if(strcmp(input1,"END")==0)

				break;
			scanf("%s",input2);
			updata(input1,input2);
		}

		scanf("%s",start);
		getchar();

		while(1)
		{
			gets(input);
			if(strcmp(input,"END")==0)
				break;

			int len=strlen(input);
			int t=0,i;
			char temp[100];

			for(i=0;i<len;i++)
			{
				if(input[i]<'a'||input[i]>'z')
				{
					
					temp[t]='\0';
					find(temp);
					printf("%c",input[i]);
					t=0;
				}
				else
				{
					temp[t++]=input[i];
				}
			
			}
			temp[t]='\0';
			find(temp);
			printf("\n");
		}
	return 0;
}



你可能感兴趣的:(c,input)