• LA 6047 Perfect Matching 字符串哈希


    一开始我用的Trie+计数,但是不是计多了就是计少了,后来暴力暴过去的……

    看了别人的代码知道是字符串哈希,但是仍有几个地方不理解:

    1.26^500溢出问题

    2.没考虑哈希碰撞?

    跪求指点!

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 
     5 #define LL unsigned long long int
     6 
     7 const int MAXN = 1010;
     8 const int MAXLEN = 510;
     9 
    10 int N;
    11 char str[MAXN][MAXLEN];
    12 int len[MAXN];
    13 LL Hash[MAXN];      //原串哈希值
    14 LL reHash[MAXN];    //逆转串哈希值
    15 LL fac[MAXLEN];
    16 
    17 void init()
    18 {
    19     fac[0] = 1;
    20     for ( int i = 1; i < MAXLEN; ++i )
    21         fac[i] = fac[i - 1] * 26;
    22     return;
    23 }
    24 
    25 void chuli( int id )
    26 {
    27     len[id] = strlen( str[id] + 1 );
    28     Hash[id] = 0;
    29     for ( int i = 1; i <= len[id]; ++i )
    30         Hash[id] = Hash[id] * 26 + str[id][i] - 'a';
    31 
    32     reHash[id] = 0;
    33     for ( int i = len[id]; i > 0; --i )
    34         reHash[id] = reHash[id] * 26 + str[id][i] - 'a';
    35 
    36     return;
    37 }
    38 
    39 int main()
    40 {
    41     int T, cas = 0;
    42     init();
    43     scanf( "%d", &T );
    44     while ( T-- )
    45     {
    46         scanf( "%d", &N );
    47         for ( int i = 0; i < N; ++i )
    48         {
    49             scanf("%s", str[i] + 1 );
    50             chuli( i );
    51         }
    52 
    53         int ans = 0;
    54         for ( int i = 0; i < N; ++i )
    55             for ( int j = 0; j < N; ++j )
    56             {
    57                 if ( i == j ) continue;
    58                 if ( Hash[i] * fac[ len[j] ] + Hash[j] == reHash[j] * fac[ len[i] ] + reHash[i] )
    59                     ++ans;
    60             }
    61 
    62         printf( "Case #%d: %d
    ", ++cas, ans );
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    盘子序列
    最大矩形面积
    【模板】ST表
    排队
    map循环遍历
    vue循环遍历给div添加id
    正则 匹配
    字符串拼接
    js对象追加到数组里
    二级标题左侧加粗线条
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3202203.html
Copyright © 2020-2023  润新知