Скачиваний:
33
Добавлен:
10.05.2014
Размер:
4.01 Кб
Скачать
#include <iostream>
#include <string.h>
#define N 20 //количество строк
#define MaxStrLen 10 //максимальная длина строки

using namespace std;


char st[N][MaxStrLen],ht[N],ArrOfSin[N];
int j,k;

void init_str(void)
{
	strcpy(st[0],"zero");
    strcpy(st[1],"one");
    strcpy(st[2],"two");
    strcpy(st[3],"three");
    strcpy(st[4],"four"); 
    strcpy(st[5],"five");
    strcpy(st[6],"six");
    strcpy(st[7],"seven");
    strcpy(st[8],"eight");
    strcpy(st[9],"nine");
    strcpy(st[10],"ten");
    strcpy(st[11],"eleven");
    strcpy(st[12],"twelve");
    strcpy(st[13],"thirteen");
    strcpy(st[14],"fourteen");
    strcpy(st[15],"fifteen");
    strcpy(st[16],"sixteen");
    strcpy(st[17],"seventeen");
    strcpy(st[18],"eighteen");
    strcpy(st[19],"nineteen");
    
    strcpy(st[4],"");
}


/*void init_str(void)
{
	for (j=0; j<N; j++)
	{
		strcpy(st[j],"");
	}
	strcpy(st[2],"000");
}*/


int hash_calc_sv2(char x[],const int size)
{
	int StringLength,HashKey,i,tmp;
	StringLength=strlen(x); //Начало вычисления ключа
	HashKey=0;
	if (StringLength%2==0) //Чётный случай
	{
		for (i=0; i<StringLength; i=i+2)
		{
			tmp=x[i];
			tmp=tmp*1000;
			tmp=tmp+x[i+1];
			HashKey=HashKey+tmp;
		}
	}
	if (StringLength%2!=0) //Нечётный случай
	{
		for (i=1; i<StringLength; i=i+2)
		{
			tmp=x[i];
			tmp=tmp*1000;
			tmp=tmp+x[i+1];
			HashKey=HashKey+tmp;
		}
		HashKey=HashKey+x[0];
	} //конец вычисления ключа
	//cout<<HashKey<<"\n";
	return (HashKey);
}


int hash_calc(char x[],const int size)
{
	int StringLength,HashKey,i;
	StringLength=strlen(x); //Начало вычисления ключа
	HashKey=0;
	for (i=0; i<=StringLength; i++)
	{
		HashKey=HashKey+x[i];
	}
	return (HashKey);
}


void init_hash_table(void)
{
	int keyd[N];
	for (j=0; j<N; j++) //Инициализация массивов
    {
		ht[j]=-1;
		ArrOfSin[j]=-1;	
	}
	
	k=0;
    for (j=0; j<N; j++) //Заполнение хэш таблицы
    {
		keyd[j]=hash_calc_sv2(st[j],strlen(st[j]))%N; //(свёртка 2) mod (количество строк)
		if (ht[keyd[j]]==-1) 
		{
			ht[keyd[j]]=j;
			//cout<<st[j]<<" "<<ht[keyd[j]]<<" "<<keyd[j]<<"(1)"<<endl;
		}
		else
		{
			keyd[j]=hash_calc(st[j],strlen(st[j]))%19; //Простое число
			if (ht[keyd[j]]==-1) 
			{
				ht[keyd[j]]=j;
				//cout<<st[j]<<" "<<ht[keyd[j]]<<" "<<keyd[j]<<"(2)"<<endl;
			}
			else
			{
				ArrOfSin[k]=j;
				//cout<<st[j]<<" "<<ht[keyd[j]]<<" "<<ArrOfSin[k]<<"(3)"<<endl;
				k++;
			}
		}
	}//Хэш таблица заполнена
}


int search_result(char InputString[])
{
	bool str_chk;
	int key,i;
	str_chk=false;
	//cout<<InputString<<endl;
	key=hash_calc_sv2(InputString,strlen(InputString))%N; //(свёртка 2) mod (количество строк)
	if (strcmp(InputString,st[ht[key]])==0)
	{
		//cout<<"found (1)"<<endl;
		str_chk=true;
		return (1);
	}
	else
	{
		key=hash_calc(InputString,strlen(InputString))%19; //Простое число
		if (strcmp(InputString,st[ht[key]])==0)
		{
			//cout<<"found (2) "<<endl;
			str_chk=true;
			return (2);
		}
		else //линейный поиск
		{
			i=0;
			do
			{
				if (strcmp(InputString,st[ArrOfSin[i]])==0)
				{
					str_chk=true;
					break;
				}
				i++;
			} while (i<k);
			if (str_chk==true) 
			{
				//cout<<"found ("<<i+3<<")"<<endl;
				return (i+3);
			}
			//else {cout<<"not found"<<endl;}
		}
	}
	if (str_chk==false) {return (-1);}
}


int main(void)
{
	char InputStr[MaxStrLen];
	
	init_str();
	init_hash_table();
	cin>>InputStr;
	//strcpy(InputStr,st[3]);
	if (search_result(InputStr)>0) {cout<<"found("<<search_result(InputStr)<<")"<<endl;}
	else {cout<<"not found"<<endl;}
	//for (j=0; j<N; j++) {cout<<st[j]<<endl;}
	return(0);
}
Соседние файлы в папке old1