zoukankan      html  css  js  c++  java
  • 3097: Hash Killer I

    3097: Hash Killer I

    Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special Judge
    Submit: 425  Solved: 157
    [Submit][Status][Discuss]

    Description

    这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:
    给你一个长度为N的字符串S,求有多少个不同的长度为L的子串。
    子串的定义是S[l]、S[l + 1]、... S[r]这样连续的一段。
    两个字符串被认为是不同的当且仅当某个位置上的字符不同。

    VFleaKing一看觉得这不是Hash的裸题么!于是果断写了哈希 + 排序。
    而hzhwcmhf神犇心里自然知道,这题就是后缀数组的height中 < L的个数 + 1,就是后缀自动机上代表的长度区间包含L的结点个数,就是后缀树深度为L的结点的数量。
    但是hzhwcmhf神犇看了看VFleaKing的做法表示非常汗。于是想卡掉他。

    VFleaKing使用的是字典序哈希,其代码大致如下:
    u64 val = 0;
    for (int i = 0; i < l; i++)
     val = val * base + s[i] - 'a';
    u64是无符号int64,范围是[0, 2^64)。VFleaKing让val自然溢出。
    base是一个常量,VFleaKing会根据心情决定其值。
    VFleaKing还求出来了base ^ l,即base的l次方,这样就能方便地求出所有长度为L的子串的哈希值。
    然后VFleaKing给哈希值排序,去重,求出有多少个不同的哈希值,把这个数作为结果。
    其算法的C++代码如下:

    typedef unsigned long long u64;

    const int MaxN = 100000;

    inline int hash_handle(const char *s, const int &n, const int &l, const int &base)
    {
     u64 hash_pow_l = 1;
     for (int i = 1; i <= l; i++)
      hash_pow_l *= base;

     int li_n = 0;
     static u64 li[MaxN];

     u64 val = 0;
     for (int i = 0; i < l; i++)
      val = val * base + s[i] - 'a';
     li[li_n++] = val;
     for (int i = l; i < n; i++)
     {
      val = val * base + s[i] - 'a';
      val -= (s[i - l] - 'a') * hash_pow_l;
      li[li_n++] = val;
     }

     sort(li, li + li_n);
     li_n = unique(li, li + li_n) - li;
     return li_n;
    }

    hzhwcmhf当然知道怎么卡啦!但是他想考考你。

    Input

    没有输入。

    Output

    你需要输出一组数据使得VFleaKing的代码WA掉。我们会使用Special Judge检查你的结果的正确性。
    输出文件共两行。
    第一行两个用空格隔开的数n、l。
    第二行是一个长度为n的字符串。只能包含'a'~'z'。
    需要保证1 <= n <= 10^5, 1 <= l <= n,
    不符合以上格式会WA。
    不要有多余字符,很可能导致你WA。

    Sample Input

    没有

    Sample Output

    8 4
    buaabuaa
    (当然这个输出是会WA的)

    HINT

    orz 波兰人 & fotile96 & sillycross

    Source

     
    题解:哈希神题不解释——对于C++的自然溢出神马的(PASCAL没有。。。TT),关键就在于构造关于2^64-1时hash值相同的字串

    具体见(VFK博客 3097 3098 3099: Hash Killer I II III),orz orz orz

     1 /**************************************************************
     2     Problem: 3097
     3     User: HansBug
     4     Language: Pascal
     5     Result: Accepted
     6     Time:0 ms
     7     Memory:324 kb
     8 ****************************************************************/
     9  
    10 var
    11    i,j,k,l,m,n:longint;
    12    s:array[0..100001] of char;
    13 begin
    14      n:=1;s[0]:='a';
    15      for i:=0 to 11 do
    16          begin
    17               for j:=0 to n-1 do
    18                   if s[j]='a' then s[j+n]:='b' else s[j+n]:='a';
    19               n:=n shl 1;
    20          end;
    21      l:=n shr 1;
    22      s[n]:='a';inc(n);
    23      for i:=1 to l-1 do
    24          begin
    25               s[n]:='a';
    26               inc(n);
    27          end;
    28      s[n]:='b';inc(n);
    29      for i:=1 to l-1 do
    30          begin
    31               s[n]:='a';
    32               inc(n);
    33          end;
    34      writeln(n,' ',l);
    35      writeln(s);
    36      readln;
    37 end.   
  • 相关阅读:
    Python for Infomatics 第14章 数据库和SQL应用四(译)
    展望2017
    bing的简单英文字典工具
    自我安慰
    Python for Infomatics 第14章 数据库和SQL应用三(译)
    Python for Infomatics 第14章 数据库和SQL应用二(译)
    Python for Infomatics 第14章 数据库和SQL应用一(译)
    希望父亲早日恢复
    Python for Infomatics 第13章 网页服务四(译)
    Python for Infomatics 第13章 网页服务三(译)
  • 原文地址:https://www.cnblogs.com/HansBug/p/4415904.html
Copyright © 2011-2022 走看看