Advertisement
despotovski01

Azbuka

May 10th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. // azbuka
  5. const int MAX_N = 100010;
  6. const int MAX_K = 102;
  7. char s[MAX_N];
  8. char p[MAX_K][MAX_K];
  9.  
  10. int nextState[MAX_K][26][MAX_K];
  11. int currState[MAX_N][MAX_K];
  12. int newState[MAX_K];
  13. int prevPos[MAX_N];
  14. int rem[MAX_N];
  15. int len[MAX_K];
  16. int endState[MAX_K];
  17. void buildDFA(int k){
  18.     for(int j = 0;j<k;++j){
  19.         int n = strlen(p[j]);
  20.         for(int i = 0;i<26;++i){
  21.             nextState[j][i][0] = 0;
  22.         }
  23.         nextState[j][p[j][0]-'A'][0] = 1;
  24.         int x = 0;
  25.         for(int i = 1;i<n;++i){
  26.             for(int c = 0;c<26;++c){
  27.                 nextState[j][c][i] = nextState[j][c][x];
  28.             }
  29.             nextState[j][p[j][i]-'A'][i] = i+1;
  30.             x = nextState[j][p[j][i]-'A'][x];
  31.         }
  32.         endState[j] = x;
  33.     }
  34. }
  35.  
  36. int main(){
  37.     scanf("%s", s);
  38.     int k;
  39.     scanf("%d", &k);
  40.     for(int i = 0;i<k;++i){
  41.         scanf("%s", p[i]);
  42.         len[i] = strlen(p[i]);
  43.     }
  44.     buildDFA(k);
  45.     int n = strlen(s);
  46.     for(int i = 0;i<k;++i){
  47.         currState[0][i] = 0;
  48.     }
  49.     for(int i = 0;i<=n;++i){
  50.         prevPos[i] = i-1;
  51.         rem[i] = 0;
  52.     }
  53.     for(int i = 1;i<=n;++i){
  54.         for(int j = 0;j<k;++j){
  55.             int c = s[i-1]-'A';
  56.             newState[j] = nextState[j][c][currState[prevPos[i]][j]];
  57.             currState[i][j] = newState[j];
  58.             if(newState[j] == len[j]){
  59.                 /// match
  60.                 int st = i;
  61.                 for(int cnt = 0;cnt < len[j];++cnt){
  62.                     st = prevPos[st];
  63.                 }
  64.                 rem[st+1]++;
  65.                 rem[i+1]--;
  66.                 prevPos[i+1] = st;
  67.                 break;
  68.             }
  69.         }
  70.     }
  71.     int curr = 0;
  72.     for(int i = 1;i<=n;++i){
  73.         curr += rem[i];
  74.         if(!curr){
  75.             printf("%c", s[i-1]);
  76.         }
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement