uva188 完美哈希题解

找一个最小的整数C使得不冲突,C必须是某个数的倍数且尽可能小,当C不满足题设条件则进行计算去找下一个C

一次ac,比较简单的模拟题,其实和哈希没啥太大关系。

注意审题,单词和单词的间隔可以不只一个空格。

转载请注明出处,谢谢!

http://blog.csdn.net/monkeyduck

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

char input[200];

int main()
{
	while (cin.getline(input,200))
	{
		int a[15],n;
		char word[15][6];
		int len=strlen(input);
		int dex1=0,dex2=0;
		int Min=0x7fffffff;
		for (int i=0;i<len;i++)
		{
			if (input[i]==' ')
			{
				word[dex1][dex2]='\0';dex1++;dex2=0;
				while(input[i+1]==' ')
					i++;
			}
			else
				word[dex1][dex2++]=input[i];
		}
		word[dex1++][dex2]='\0';
		for (int i=0;i<dex1;i++)
		{
			int value=0,exp=1;
			for (int j=strlen(word[i])-1;j>=0;j--)
			{
				value=value+exp*(word[i][j]-'a'+1);
				exp = exp << 5;
			}
			a[i]=value;
			if (a[i]<Min)
				Min = a[i];
		}
		int C=Min;
		bool flag;
		while (1)
		{
			flag=1;
			for (int i=0;i<dex1-1;i++)
			{
				for (int j=i+1;j<dex1;j++)
				{
					int p=C/a[i];
					int q=C/a[j];
					if (p%dex1==q%dex1)
					{
						flag=0;
						C=min((p+1)*a[i],(q+1)*a[j]);
						break;
					}
				}
				if (!flag) continue;
			}
			if (flag)
				break;
		}
		for (int i=0;i<len;i++)
			cout<<input[i];
		cout<<endl<<C<<endl<<endl;
		
	}
	return 0;
}


你可能感兴趣的:(C++,ACM,uva)