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 }
  • 相关阅读:
    奇数阶魔方问题
    《DSP using MATLAB》示例9.3
    《DSP using MATLAB》示例9.2
    《DSP using MATLAB》示例9.1
    找个目标很重要
    《DSP using MATLAB》示例Example 8.30
    《DSP using MATLAB》示例Example 8.29
    《DSP using MATLAB》示例Example 8.28
    《DSP using MATLAB》示例Example 8.27
    《DSP using MATLAB》示例Example 8.26
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8612607.html
Copyright © 2011-2022 走看看