• POJ 1200 Crazy Search 【hash】


    <题目链接>

    题目大意:

    给定n,nc,和一个字符串,该字符串由nc种字符组成,现在要你寻找该字符串中长度为n的子字符串有多少种。

    解题分析:

    因为要判重,所以讲这些字符串hash一下,将不同的字符串映射为数字,这里我们是将该字符串转化为nc进制数,不同的字符串分别对应nc进制下不同的数。

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 const int M =16e6+10;
     5 char str[M];
     6 bool hash[M];
     7 int cur[256];
     8 
     9 int main(){
    10     int n,nc;
    11     while(scanf("%d%d%s",&n,&nc,str)!=EOF){
    12         int cnt=0;
    13         memset(cur,0,sizeof(cur));
    14         memset(hash,false,sizeof(hash));
    15         int len=strlen(str);
    16         for(int i=0;i<len;i++){    //给所有字符都分配编号 
    17             if(!cur[str[i]])   
    18                 cur[str[i]]=++cnt;
    19             if(cnt==nc)break;
    20         }
    21         int ans=0;
    22         for(int i=0;i+n-1<len;i++){
    23             int sum=0;
    24             for(int j=i;j<i+n;j++){
    25                 sum+=sum*nc+cur[str[j]];   //得到该字符串转化为nc进制数的值 
    26             }
    27             if(!hash[sum]){
    28                 ++ans;
    29                 hash[sum]=true;
    30             }
    31         }
    32         printf("%d
    ",ans);
    33     }
    34     return 0;
    35 }

    2018-10-30

  • 相关阅读:
    ip netns
    PPT动手动脑1
    暑假作业日总结
    暑假作业日总结
    课前测试总结
    暑假作业日总结
    大二上每日总结
    暑假作业日总结
    大二上每日总结
    暑假作业日总结
  • 原文地址:https://www.cnblogs.com/00isok/p/9880343.html
Copyright © 2020-2023  润新知