字符串——BZOJ 3097: Hash Killer I【构造题,思维题】

BZOJ 3097: Hash Killer I【构造题,思维题】

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3097
题意:让你出一组数据可以卡掉自然溢出的hash,数据包括n 和 l 以及str,长度为n字符串的l长字串存在hash冲突。
我的收获:强强强

(1) 当base为偶数时,若两个字符串后面的64及以上的字符串相同时,hash值相同。
(2) 当base为奇数时,参考vfk的做法。

a \ b表示a能整除b。(orz 具体数学)
strA . strB 代表字符串串联。如"娃" . “哈哈” = “娃哈哈”

设字符串序列{orzstr[i]},orzstr[1] = “a”, orzstr[i] = orzstr[i - 1] . not(orzstr[i - 1])
设hash(str)为str的哈希值。
hash(orzstr[i]) = hash(orzstr[i - 1]) * base ^ |not(orzstr[i - 1])| + hash(not(orzstr[i - 1]))
= hash(orzstr[i - 1]) * base ^ (2 ^ (i - 2)) + hash(not(orzstr[i - 1]))
hash(not(orzstr[i - 1])) * base ^ (2 ^ (i - 2)) + hash(orzstr[i - 1])
hash(orzstr[i]) - hash(not(orzstr[i]))
= (hash(orzstr[i - 1]) - hash(not(orzstr[i - 1]))) * (base ^ (2 ^ (i - 2)) - 1)
hash(not(orzstr[i]))似乎是个神奇的东西。而我们的目的实际上是要找两个字符串strA, strB使得
相当与
设数列{f[i]},f[i] = hash(orzstr[i]) - hash(not(orzstr[i]))
f[i] = f[i - 1] * (base ^ (2 ^ (i - 2)) - 1)
base ^ (2 ^ (i - 1)) - 1
f[i] = f[i - 1] * g[i - 1]
然后发现一个神奇的事情?
问题是不是结束了呢……发现没有……这样的话我们要使2 ^ 64 \ f[i],至少得让i = 65……然后发现|orzstr[65]|是个天文数字。
i > 1时有:
base ^ (2 ^ (i - 1)) - 1 = (base ^ (2 ^ (i - 2)) - 1) * (base ^ (2 ^ (i - 2)) + 1) = g[i - 1] * 一个偶数
那么4 \ g[2],8 \ g[3]…
所以f[i] 实际上有:
2 ^ (i * (i - 1) / 2) \ f[i]
这就是卡base为奇数时的方法。orzstr[12]和not(orzstr[12])即为所求。

而读入中base既有奇数又有偶数,直接在奇数构造的字符串后面加64个a就可以了。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e6+50;
int a[maxn];

int main()
{
    int len = 1;
    a[1] = 1;
    while(len <= 100000){
        for(int i = 1; i <= len; i++){
            if(a[i] == 1)
                a[i+len] = 0;
            else
                a[i+len] = 1;
        }
        len <<= 1;
    }
    //从a开始每2^i i从0到65 与当前前面的字符串反转即a变成b,b变成a
    //如abbabaabbaababba, 这可以卡自然溢出的base为基数的hash
    printf("100000 10000\n");
    //字符串的长度一定不足1e5,用相同的64个以上的相同字符串可以卡base为基数的hash
    for(int i = 1; i <= 100000; i++){
        if(a[i] == 1)
            printf("a");
        else
            printf("b");
    }
    printf("\n");
    return 0;
}

发布了23 篇原创文章 · 获赞 6 · 访问量 833

猜你喜欢

转载自blog.csdn.net/wxy2635618879/article/details/103963704