zoukankan      html  css  js  c++  java
  • P3370 【模板】字符串哈希

     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人数的话),我想你一定会明白字符串哈希的正确姿势的^_^

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<iostream>
     7 #include<map>
     8 
     9 using namespace std;
    10 const long long mod = 1e18+7;
    11 
    12 int Hash[10010];
    13 char s[10010];
    14 long long a[10010];
    15 
    16 inline int read() {
    17     int x = 0,f = 1;char ch = getchar();
    18     for (; ch<'0'||ch>'9'; ch = getchar())
    19         if (ch=='-') f = -1;
    20     for (; ch>='0'&&ch<='9'; ch = getchar())
    21         x = x*10+ch-'0';
    22     return x*f;
    23 }
    24 void init() {
    25     Hash[1] = 1;
    26     for (int i=2; i<=10010; ++i) {
    27         Hash[i] = (Hash[i-1]*31)%mod;
    28     }
    29 }
    30 int main() {
    31     
    32     init();
    33     int n = read(),ans = 1; // 初始值为1 
    34     
    35     for (int i=1; i<=n; ++i) {
    36         scanf("%s",s+1);
    37         int len = strlen(s+1);
    38         long long tmp = 1;
    39         for (int j=1; j<=len; ++j) {
    40             tmp = (tmp*(s[j]-'a'+1)*Hash[j])%mod;
    41         }
    42         a[i] = tmp;
    43     }
    44     
    45     sort(a+1,a+n+1);
    46     for (int i=2; i<=n; ++i) {
    47         if (a[i]!=a[i-1]) ans++;
    48     }
    49     printf("%d",ans);
    50     return 0;
    51 }
  • 相关阅读:
    ASCII、GBK、Unicode、UTF-8、ISO-8859-1等常见字符编码介绍
    HTTP协议简介
    关于无知的一点思考
    Java 8 新特性之lambda表达式
    Java 8 新特性之新的日期时间库
    【java】<Jsoup>获取网页中的图片
    【数据结构】二叉树
    【转载】Android中UI线程与后台线程交互设计的5种方法
    【数据结构】广义表
    【c语言】数据结构(约瑟夫生者死者游戏的问题)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8612607.html
Copyright © 2011-2022 走看看