ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ_1200 Crazy Search ( Hash映射 )

2019-09-12 11:39:30  阅读:283  来源: 互联网

标签:Crazy toInt Hash int nc 1200 rg cnt define


题目连接

题意

给一个含有nc个不同字母的字符串,然后求其中有多少个长度为n的不同子串.

题解

因为题目中给出了nc,即字母种类的个数。所以可以把每一个出现的字母对应为1到nc。然后把长度为n的字符串映射成为一个整数。即把这个字符串看成一个nc进制的数。

代码

#include<cstdio>
#include<cstring>
using namespace std;
#define rg register 
#define sc scanf 
#define pf printf 
char s[1000000];
bool hs[16000005];

int n, nc; // 迷之错误, 这两行开局部变量就RE woc!@
int toInt[256+50]; // 转化成十进制, 再用哈希标记

int main ( ) {

    sc( "%d %d %s", &n, &nc, s ); 

    rg int cnt = 0; 
    for ( rg int i = 0; s[i] != '\0'; ++i ) { // 此处就是将 二十六个小写字母转化成 nc进制 
        if( !toInt[s[i]] )
            toInt[s[i]] = ++cnt;
        if ( cnt == nc ) break;
    }

    rg int ans = 0;

    rg int len = strlen(s)-n;
    for ( rg int i = 0; i <= len; ++i ) {
        rg int sum = 0; 
        for( rg int j = 0; j < n; ++j )
            sum = sum*nc+toInt[s[i+j]]-1; // n进制从零开始算的, 此时要减一, 这个公式太巧妙了 
        if( !hs[sum] )
            hs[sum]=true,ans++;
    }



    pf( "%d\n", ans );



    return 0;
}

标签:Crazy,toInt,Hash,int,nc,1200,rg,cnt,define
来源: https://blog.csdn.net/weixin_44510468/article/details/100766259

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有