#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) */