• 洛谷——P3370 【模板】字符串哈希


    题目描述

    如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。

    友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)

    输入输出格式

    输入格式:

    第一行包含一个整数N,为字符串的个数。

    接下来N行每行包含一个字符串,为所提供的字符串。

    输出格式:

    输出包含一行,包含一个整数,为不同的字符串个数。

    输入输出样例

    输入样例#1:
    5
    abc
    aaaa
    abc
    abcc
    12345
    输出样例#1:
    4

    说明

    时空限制:1000ms,128M

    数据规模:

    对于30%的数据:N<=10,Mi≈6,Mmax<=15;

    对于70%的数据:N<=1000,Mi≈100,Mmax<=150

    对于100%的数据:N<=10000,Mi≈1000,Mmax<=1500

    样例说明:

    样例中第一个字符串(abc)和第三个字符串(abc)是一样的,所以所提供字符串的集合为{aaaa,abc,abcc,12345},故共计4个不同的字符串。

    Tip: 感兴趣的话,你们可以先看一看以下三题:

    BZOJ3097:http://www.lydsy.com/JudgeOnline/problem.php?id=3097

    BZOJ3098:http://www.lydsy.com/JudgeOnline/problem.php?id=3098

    BZOJ3099:http://www.lydsy.com/JudgeOnline/problem.php?id=3099

    如果你仔细研究过了(或者至少仔细看过AC人数的话),我想你一定会明白字符串哈希的正确姿势的^_^

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdio>
     5 
     6 #define ull unsigned long long
     7 #define base1 1499
     8 #define base2 1493
     9 
    10 using namespace std;
    11 
    12 const int N(10000+15);
    13 char s[N];
    14 ull n;
    15 struct Node
    16 {
    17     ull hash1,hash2;
    18 }node[N];
    19 
    20 ull Get_hash1(char a[],ull len)
    21 {
    22     ull ret=1;
    23     for(int i=0;i<len;i++)
    24         ret=ret*base1+(a[i]-'0');
    25     return ret;
    26 }
    27 
    28 ull Get_hash2(char a[],ull len)
    29 {
    30     ull ret=1;
    31     for(int i=0;i<len;i++)
    32         ret=ret*base2+(a[i]-'0');
    33     return ret;
    34 }
    35 
    36 bool cmp(Node a,Node b)
    37 {
    38     
    39     return a.hash1<b.hash1;
    40 }
    41 
    42 int main()
    43 {
    44     scanf("%d",&n);
    45     for(int i=1;i<=n;i++)
    46     {
    47         scanf("%s",s);
    48         node[i].hash1=Get_hash1(s,strlen(s));
    49         node[i].hash2=Get_hash2(s,strlen(s));
    50     }
    51     sort(node+1,node+n+1,cmp);
    52     int ans=1;
    53     for(int i=2;i<=n;i++)
    54         if(node[i].hash1==node[i-1].hash1&&node[i].hash2==node[i-1].hash2) continue;
    55         else ans++;
    56     printf("%d
    ",ans);
    57     return 0;
    58 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6891808.html
Copyright © 2020-2023  润新知