zoukankan      html  css  js  c++  java
  • 字符串hash模板

    简介:

      做hdu4300看到的题解,除了kmp还可以用字符串hash做

    模板:

     1 typedef unsigned long long ull;
     2 const int maxn=100000+10;
     3 const ull base = 163;
     4 char s[maxn],t[maxn];
     5 ull h1[maxn],h2[maxn];
     6 ull p[maxn];
     7 void init(){    ///处理hash值
     8     p[0] = 1;
     9     h1[0] = h2[0]=0;
    10     int n = strlen(s+1);    ///字符串从1开始读
    11     for(int i = 1; i <=100000; i ++) p[i] =p[i-1] * base;
    12     for(int i = 1; i <=n; i ++) hash[i] = hash[i - 1] * base + (s[i] - 'a');
    13 }
    14 ull geth(int l, int r, ull g[]){///取出g里l - r里面的字符串的hash值
    15     return g[r] - g[l - 1] * p[r - l + 1];
    16 }
    View Code

    字符串hash:

     1 #include<bits/stdc++.h>
     2 #define numm ch-48
     3 #define pd putchar(' ')
     4 #define pn putchar('
    ')
     5 #define pb push_back
     6 #define debug(args...) cout<<#args<<"->"<<args<<endl
     7 #define bug cout<<"************"
     8 using namespace std;
     9 template <typename T>
    10 void read(T &res) {
    11     bool flag=false;char ch;
    12     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
    13     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);
    14     flag&&(res=-res);
    15 }
    16 template <typename T>
    17 void write(T x) {
    18     if(x<0) putchar('-'),x=-x;
    19     if(x>9) write(x/10);
    20     putchar(x%10+'0');
    21 }
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef long double ld;
    25 const int maxn=100000+10;
    26 const int maxm=1000+10;
    27 const int inf=0x3f3f3f3f;
    28 const int mod=1e9+7;
    29 const ull base = 163;
    30 char s[maxn],t[maxn];
    31 ull h1[maxn],h2[maxn];
    32 ull p[maxn];
    33 void init(){    ///处理hash值
    34     p[0] = 1;
    35     h1[0] = h2[0]=0;
    36     int n = strlen(s+1);    ///字符串从1开始读
    37     for(int i = 1; i <=100000; i ++) p[i] =p[i-1] * base;
    38 //    for(int i = 1; i <=n; i ++) hash[i] = hash[i - 1] * base + (s[i] - 'a');
    39 }
    40 ull geth(int l, int r, ull g[]){///取出g里l - r里面的字符串的hash值
    41     return g[r] - g[l - 1] * p[r - l + 1];
    42 }
    43 int main()
    44 {
    45     init();
    46     int _;
    47     read(_);
    48     char str[30];
    49     while(_--) {
    50         map<char,char>mp;
    51         scanf("%s%s",str,s+1);
    52         for(int i=0;i<26;i++)
    53             mp[str[i]]=i+'a';
    54         int lenstr=strlen(str),lens=strlen(s+1);
    55         for(int i=1;i<=lens;i++)
    56             t[i]=mp[s[i]];
    57         for(int i=1;i<=lens;i++) {
    58             h1[i]=h1[i-1]*base+(s[i]-'a');
    59             h2[i]=h2[i-1]*base+(t[i]-'a');
    60         }
    61         int lent=strlen(t+1);
    62         int a=lens/2+lens%2,pos=0;
    63         for(int i=a;i<=lens;i++) {
    64             int l=geth(1,lens-i,h2);
    65             int r=geth(i+1,lens,h1);
    66             if(l==r) {
    67                 pos=i;
    68                 break;
    69             }
    70         }
    71         cout<<s+1;
    72         if((pos<<1)!=lens) {
    73             for(int i=lens-pos+1;i<=pos;i++)
    74                 putchar(t[i]);
    75         }
    76         pn;
    77     }
    78     return 0;
    79 }

    KMP:

     1 #include<bits/stdc++.h>
     2 #define numm ch-48
     3 #define pd putchar(' ')
     4 #define pn putchar('
    ')
     5 #define pb push_back
     6 #define debug(args...) cout<<#args<<"->"<<args<<endl
     7 #define bug cout<<"************"
     8 using namespace std;
     9 template <typename T>
    10 void read(T &res) {
    11     bool flag=false;char ch;
    12     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
    13     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);
    14     flag&&(res=-res);
    15 }
    16 template <typename T>
    17 void write(T x) {
    18     if(x<0) putchar('-'),x=-x;
    19     if(x>9) write(x/10);
    20     putchar(x%10+'0');
    21 }
    22 typedef long long ll;
    23 typedef long double ld;
    24 const int maxn=100000+10;
    25 const int maxm=1000+10;
    26 const int inf=0x3f3f3f3f;
    27 const int mod=1e9+7;
    28 char s[maxn],t[maxn];
    29 int net[maxn];
    30 void getnext(char t[],int len) {
    31     int i=0,j=-1;
    32     net[0]=-1;
    33     while(i<len) {
    34         if(j==-1||t[i]==t[j]) {
    35             i++,j++;
    36             net[i]=j;
    37         }
    38         else j=net[j];
    39     }
    40 }
    41 int KMP(int lens,int lent){
    42     int j=0,i=lens/2+lens%2;
    43     while(i<lens&&j<lent) {
    44         if(j==-1||s[i]==t[j])
    45             i++,j++;
    46         else j=net[j];
    47     }
    48     return j;
    49 }
    50 int main()
    51 {
    52     int _;
    53     read(_);
    54     char str[30];
    55     while(_--) {
    56         map<char,char>mp;
    57         scanf("%s%s",str,s);
    58         for(int i=0;i<26;i++)
    59             mp[str[i]]=i+'a';
    60         int lenstr=strlen(str),lens=strlen(s);
    61         for(int i=0;i<lens;i++)
    62             t[i]=mp[s[i]];
    63         int lent=strlen(t);
    64         getnext(t,lent);
    65         int len=KMP(lens,lent);
    66         cout<<s;
    67         if((len<<1)!=lenstr) {
    68             for(int i=len;i<lens-len;i++)
    69                 putchar(t[i]);
    70         }
    71         pn;
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    练习5.6.3节
    size_t
    练习3.43
    use include to read a file
    ACM数学(转)
    POJ 2039 To and Fro
    poj 1716 差分约束
    poj 3159 差分约束
    hdu 4571 floyd+动态规划
    poj 1364 差分约束
  • 原文地址:https://www.cnblogs.com/wuliking/p/11679586.html
Copyright © 2011-2022 走看看