给定一个字符串hash,为 ∑i=0len−1str[i]×31len−1−i
求 K个长度不超过 1000的字符串,使得他们的 hash值相等
其中每个 hash值是 32位有符号整数,K≤1000
思路:将字符串看成是31进制,前一位-1,后一位+31,转换成十进制的结果是不变的
#include<stdio.h>
#include<string.h>
using namespace std;
char str[1005];
int n;
int main()
{
freopen("in.txt", "r", stdin);
freopen("hash.in", "r", stdin);
freopen("hash.out", "w", stdout);
while(~scanf("%d", &n))
{
for(int i=0; i<n; i++) str[i] = 'X';
str[n]='\0';
printf("%s\n",str);
for(int i=0; i<n-1; i++)
{
str[i] -= 1; str[i+1] += 31;
printf("%s\n",str);
str[i] += 1; str[i+1] -= 31;
}
}
return 0;
}
思路:Aa和BB的hash值是一样的,将字符串看成Aa和BB的组合,每次可以选择Aa或者BB
#include<stdio.h>
#include<string.h>
using namespace std;
char str[1005];
int n;
int main()
{
freopen("in.txt", "r", stdin);
freopen("hash.in", "r", stdin);
freopen("hash.out", "w", stdout);
while(~scanf("%d", &n))
{
for(int i=0;i<n;i++)
{
for(int j=0;j<10;j++)
if(i&(1<<j)) printf("Aa");
else printf("BB");
printf("\n");
}
}
return 0;
}