Advertisement
Manioc

Hash

Mar 2nd, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 2007
  3.  
  4. using namespace std;
  5.  
  6. typedef long long int ll;
  7. typedef pair<ll, ll> pll;
  8.  
  9. string txt, rev;
  10. int arr[MAX];
  11.  
  12. struct hash_{
  13.     ll _hash[2][MAX], mult[2][MAX];
  14.     ll b1, b2 , m1, m2;
  15.     hash_(ll b1 = 311,ll m1 = 1000000021,ll b2 = 317,ll m2 = 1000000009):
  16.         b1(b1), m1(m1), b2(b2), m2(m2){calc();}
  17.  
  18.     void calc(){
  19.         mult[0][0] = mult[1][0] = 1;
  20.         for(ll i = 1; i < MAX; i++){
  21.             mult[0][i] = (mult[0][i-1]*b1)%m1;
  22.             mult[1][i] = (mult[1][i-1]*b2)%m2;
  23.         }
  24.     }
  25.  
  26.     void compute(string &txt){
  27.         _hash[1][0] = _hash[0][0] = txt[0] + 1;
  28.         for(int i = 1; i < txt.size(); i++){
  29.             _hash[0][i] = ((_hash[0][i-1]*b1)%m1 + txt[i]+1)%m1;
  30.             _hash[1][i] = ((_hash[1][i-1]*b2)%m2 + txt[i]+1)%m2;
  31.         }
  32.     }
  33.  
  34.     pll substr(ll l, ll r){
  35.         if(!l) return make_pair(_hash[0][r], _hash[1][r]);
  36.  
  37.         ll x = (_hash[0][r]-(_hash[0][l-1]*mult[0][r-l+1])%m1 + m1)%m1;
  38.         ll y = (_hash[1][r]-(_hash[1][l-1]*mult[1][r-l+1])%m2 + m2)%m2;
  39.         return make_pair(x, y);
  40.     }
  41. } palavra, reversa;
  42.  
  43. void reverte(){
  44.     rev = "";
  45.     for(int i = txt.size()-1; i >= 0; i--){
  46.         rev += txt[i];
  47.     }
  48. }
  49.  
  50. bool check(ll l, ll r){
  51.     pll x = palavra.substr(l, r);
  52.     pll y = reversa.substr(txt.size()-r-1, txt.size()-l-1);
  53.     return x.first == y.first && y.second == x.second;
  54. }
  55. int main(){
  56.     cin >> txt;
  57.     reverte();
  58.     palavra.compute(txt); reversa.compute(rev);
  59.  
  60.     int num; cin >> num;
  61.     for(int i = 0; i < num; i++) {
  62.         int aux; cin >> aux;
  63.         arr[aux]++;
  64.     }
  65.     int ans = 0, maior = 0;
  66.     for(ll l = 0; l < txt.size(); l++){
  67.         int aux = 0;
  68.         for(ll r = l; r < txt.size(); r++){
  69.             aux += arr[r];
  70.             if(check(l, r) && maior <= aux){
  71.                 if(maior == aux) {
  72.                     if(ans < r-l+1) ans = r-l+1;
  73.                 }else{
  74.                     maior = aux;
  75.                     ans = r-l+1;
  76.                 }
  77.             }
  78.         }
  79.     }
  80.  
  81.     cout << ans << endl;
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement