【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest H】【字符串哈希 构造】Hash Code Hacker 构造有相同哈希值的不同字符串

#include<stdio.h> 
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=1010,M=0,Z=1e9+7,ms63=1061109567;
int casenum,casei;
int n;const int len=20;
char s[N][24];
void init()
{
	for(int j=0;j<len;j++)s[0][j]='C';
	for(int i=1;i<=1000;i++)
	{
		MC(s[i],s[0]);
		int p=1;
		int x=i;
		while(x)
		{
			if(x&1)
			{
				s[i][p-1]='B';
				s[i][p]='b';
			}
			x>>=1;
			p+=2;
		}
	}
}
int cnt(char s[])
{
	int mul=1;
	int tmp=0;
	for(int i=19;~i;--i)
	{
		tmp+=s[i]*mul;
		mul*=31;
	}
	return tmp;
}
void fre()
{
	freopen("hash.in","r",stdin);
	freopen("hash.out","w",stdout);
}
int main()
{
	fre();
	init();
	while(~scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
		{
			puts(s[i]);
			//printf("%d\n",cnt(s[i]));
		}
	}
	return 0;
}
/*
【题意】
我们有一个字符串哈希函数,hashcode(s)=s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]。
让你构造n个不同的字符串,只含有大小写字符,使得这些字符串有相同的哈希值。
注意,运算都是基于signed 32 bit int

【类型】
构造 脑洞

【分析】
我们发现,
'A'~'Z'=65~90
'a'~'z'=97~122
ASCII码差值在31,还是可以保持在大小写字符中的。
于是上一位-1,下一位+31.
按照这个构造1000个不同字符串,输出即可~

【时间复杂度&&优化】
O(n*len)

*/

你可能感兴趣的:(ACM,codeforces,构造,字符串哈希)