Advertisement
osipyonok

boyer moore substring

Jan 5th, 2017
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define INF 1000010000
  4. #define nl '\n'
  5. #define pb push_back
  6. #define ppb pop_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define pii pair<int,int>
  11. #define pdd pair<double,double>
  12. #define all(c) (c).begin(), (c).end()
  13. #define SORT(c) sort(all(c))
  14. #define sz(c) (c).size()
  15. #define rep(i,n) for( int i = 0; i < n; ++i )
  16. #define repi(i,n) for( int i = 1 ; i <= n; ++i )
  17. #define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
  18. #define repf(j,i,n) for( int j = i ; j < n ; ++j )
  19. #define die(s) {std::cout << s << nl;}
  20. #define dier(s) {std::cout << s; return 0;}
  21. #define vi vector<int>
  22. typedef long long ll;
  23.  
  24. using namespace std;
  25.  
  26. vi preBmBc(string x){
  27.     vi t(256 , sz(x));
  28.     rep(i , sz(x) - 1){
  29.         t[x[i]] = sz(x) - i - 1;
  30.     }
  31.     return t;
  32. }
  33.  
  34. bool isPrefix(string x , int p){
  35.     int i;
  36.     int suffixlen = sz(x) - p;
  37.  
  38.     for (i=0; i < suffixlen; i++) {
  39.         if (x[i] != x[p+i]) {
  40.             return 0;
  41.         }
  42.     }
  43.     return 1;
  44. }
  45.  
  46. int suffixLength(string x , int p) {
  47.     int i;
  48.     for (i = 0; (x[p-i] == x[sz(x)-1-i]) && (i < p); i++);
  49.     return i;
  50. }
  51.  
  52. vi preBmGs(string x){
  53.     vi t(sz(x));
  54.     int p;
  55.     int last_prefix_index = 1;
  56.     for (p=sz(x)-1; p>=0; p--) {
  57.         if (isPrefix(x , p+1)) {
  58.             last_prefix_index = p+1;
  59.         }
  60.         t[p] = (sz(x)-1 - p) + last_prefix_index;
  61.     }
  62.     for (p=0; p < sz(x)-1; p++) {
  63.         int slen = suffixLength(x , p);
  64.         if (x[p - slen] != x[sz(x)-1 - slen]) {
  65.             t[sz(x)-1 - slen] = sz(x)-1 - p + slen;
  66.         }
  67.     }
  68.     return t;
  69. }
  70.  
  71. int BM(string s , string x){
  72.     if(!sz(x)){
  73.         return -1;
  74.     }
  75.  
  76.     vi bmBc = preBmBc(x);
  77.     vi bmGs = preBmGs(x);
  78.  
  79.  
  80.     int n_shifts = 0;
  81.  
  82.     int i = sz(x)-1;
  83.     while (i < sz(s)) {
  84.         int j = sz(x)-1;
  85.         while (j >= 0 && (s[i] == x[j])) {
  86.             --i;
  87.             --j;
  88.         }
  89.         if (j < 0) {
  90.             return i + 1;
  91.         }
  92.         i += max(bmBc[s[i]], bmGs[j]);
  93.     }
  94.     return -1;
  95. }
  96.  
  97. int main() {
  98.     ios_base::sync_with_stdio(false);
  99.     cin.tie(NULL);
  100.     cout.precision(0);
  101.     string s , x;
  102.     cin >> s >> x;
  103.     die(BM(s , x));
  104.  
  105.  
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement