Source code for submission s1153

bugs.cpp

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. int lines;
  7. char bug[1004];
  8. int buglen;
  9. int back[1004];
  10. char line[2000004];
  11. char buf[2000004];
  12. int sbuf[2000004];
  13. int bufpos;
  14. int state;
  15.  
  16.  
  17. void step(char x) {
  18. while (bug[state + 1] != x && state != 0) {
  19. state = back[state];
  20. }
  21. if (bug[state + 1] == x) {
  22. ++state;
  23. }
  24. }
  25.  
  26. void construct() {
  27. back[0] = 0;
  28. back[1] = 0;
  29. state = 0;
  30. for (int i = 2; i < buglen; ++i) {
  31. step(bug[i]);
  32. back[i] = state;
  33. }
  34. }
  35.  
  36. void search() {
  37. bufpos = 0;
  38. state = 0;
  39.  
  40. int i = 0;
  41. while (line[i] != '\0') {
  42. step(line[i]);
  43.  
  44. buf[bufpos] = line[i];
  45. sbuf[bufpos] = state;
  46. ++bufpos;
  47.  
  48. if (state == buglen) {
  49. // found! delete
  50. bufpos -= buglen;
  51. state = sbuf[bufpos - 1];
  52. }
  53. ++i;
  54. }
  55. }
  56.  
  57. int main() {
  58. bug[0] = '\0';
  59. while (scanf("%d %s\n", &lines, bug + 1) != EOF) {
  60. buglen = strlen(bug + 1);
  61. construct();
  62.  
  63. for (int i = 0; i < lines; ++i) {
  64. fgets(line, 2000004, stdin);
  65.  
  66. search();
  67.  
  68. buf[bufpos] = '\0';
  69. printf("%s", buf);
  70. }
  71. }
  72. }
  73.