Advertisement
Mirandek

Untitled

Aug 11th, 2015
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. int n;
  9. const int MAX_LEN = 200010;
  10. const int P = 10007;
  11. char str[MAX_LEN];
  12. int exponent[MAX_LEN];
  13.  
  14. void create_exponent(int n) {
  15.     exponent[0] = 1;
  16.     for (int i = 1; i < n; i++) {
  17.         exponent[i] = (long long)(P) * exponent[i - 1];
  18.     }
  19. }
  20.  
  21. class Hash {
  22.     vector<long long> v;
  23. public:
  24.     Hash() {}
  25.     void initialize(char* str) {
  26.         this->v.resize(n, 0);
  27.         this->v[0] = str[0];
  28.         for (int i = 1; i < n; i++) {
  29.             this->v[i] = this->v[i-1] * P + str[i];
  30.         }
  31.     }
  32.     int get_hash(int loc, int len) {
  33.         int h;
  34.         if (loc == 0) {
  35.             h = this->v[len - 1];
  36.         } else {
  37.             h = (this->v[loc + len - 1] - (this->v[loc - 1] * exponent[len]));
  38.         }
  39.         return h;
  40.     }
  41. };
  42.  
  43. Hash hc;
  44.  
  45. bool find_length(int mid) {
  46.     int hash_code[n - mid + 1];
  47.     for (int i = 0; i < n - mid + 1; i++) {
  48.         hash_code[i] = hc.get_hash(i, mid);
  49.     }
  50.     sort(hash_code, hash_code + n - mid + 1);
  51.     for (int i = 0; i < n - mid; i++)
  52.         if (hash_code[i] == hash_code[i + 1])
  53.             return true;
  54.     return false;
  55. }
  56.  
  57. int main() {
  58.     scanf("%d", &n);
  59.     scanf("%s", &str);
  60.     hc.initialize(str);
  61.  
  62.     create_exponent(MAX_LEN);
  63.  
  64.     int s = 0, e = n;
  65.     int mid;
  66.  
  67.     while (s + 1 < e) {
  68.         mid = (s + e) / 2;
  69.         if (find_length(mid)) {
  70.             s = mid;
  71.         } else {
  72.             e = mid;
  73.         }
  74.     }
  75.     printf("%d\n", s);
  76.  
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement