Advertisement
Guest User

Untitled

a guest
Jun 26th, 2016
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. #include <cstring>
  2. #include <queue>
  3.  
  4. #define MAXN 10005
  5. int state[MAXN][26];
  6. bool terminal[MAXN];
  7. int statecount ;
  8. int F[MAXN];
  9.  
  10. void clear(){
  11. memset( state , 0 , sizeof state );// 0 is a not valid state
  12. memset( terminal , 0 , sizeof terminal );
  13. statecount = 1;
  14. }
  15.  
  16. void add(char *s){
  17. int pos = 0; // and the root too :3
  18. for( int i = 0 ; s[i] ; ++i ){
  19. int next = s[i] - 'a';
  20. if( state[pos][next] == 0 ){
  21. state[pos][next] = statecount++;
  22. }
  23. pos = state[pos][next];
  24. }
  25. terminal[pos] = true;
  26. }
  27.  
  28. void AC(){
  29. std::queue<int> Q;
  30. for( int i = 0 ; i < 26 ; ++i ){
  31. int cur = state[0][i];
  32. if( cur ){
  33. F[cur] = 0;
  34. Q.push(cur);
  35. }
  36. }
  37. while(!Q.empty()){
  38. int cur = Q.front(); Q.pop();
  39. for( int i = 0 ; i < 26 ; ++i ){
  40.  
  41. int u = state[cur][i];
  42. if( u ){
  43. int p = F[cur];
  44. while( p && state[ p ] [ i ] == 0 )
  45. p = F[ p ];
  46. p = state[p][i];
  47. F[ u ] = p;
  48. terminal[ u ] |= terminal[ p ];
  49. Q.push( u );
  50. }
  51. }
  52. }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement