日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

ac自动机模板(hdu2222)

發布時間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ac自动机模板(hdu2222) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  1. 具體代碼;??
  2. #include?<stdio.h>??
  3. #include?<stdlib.h>??
  4. #include?<string.h>??
  5. struct?Node??
  6. {??
  7. ????int?cnt;//是否為該單詞的最后一個結點???
  8. ????Node?*fail;//失敗指針???
  9. ????Node?*next[26];//Trie中每個結點的各個節點???
  10. }*queue[500005];//隊列,方便用BFS構造失敗指針???
  11. char?s[1000005];//主字符串???
  12. char?keyword[55];//需要查找的單詞???
  13. Node?*root;//頭結點???
  14. void?Init(Node?*root)//每個結點的初始化???
  15. {??
  16. ????root->cnt=0;??
  17. ????root->fail=NULL;??
  18. ????for(int?i=0;i<26;i++)??
  19. ????????root->next[i]=NULL;??
  20. }??
  21. void?Build_trie(char?*keyword)//構建Trie樹???
  22. {??
  23. ????Node?*p,*q;??
  24. ????int?i,v;??
  25. ????int?len=strlen(keyword);??
  26. ????for(i=0,p=root;i<len;i++)??
  27. ????{??
  28. ????????v=keyword[i]-'a';??
  29. ????????if(p->next[v]==NULL)??
  30. ????????{??
  31. ????????????q=(struct?Node?*)malloc(sizeof(Node));??
  32. ????????????Init(q);??
  33. ????????????p->next[v]=q;//結點鏈接???
  34. ????????}??
  35. ????????p=p->next[v];//指針移動到下一個結點???
  36. ????}??
  37. ????p->cnt++;//單詞最后一個結點cnt++,代表一個單詞???
  38. }??
  39. void?Build_AC_automation(Node?*root)??
  40. {??
  41. ????int?head=0,tail=0;//隊列頭、尾指針???
  42. ????queue[head++]=root;//先將root入隊???
  43. ????while(head!=tail)??
  44. ????{??
  45. ????????Node?*p=NULL;??
  46. ????????Node?*temp=queue[tail++];//彈出隊頭結點???
  47. ????????for(int?i=0;i<26;i++)??
  48. ????????{??
  49. ????????????if(temp->next[i]!=NULL)//找到實際存在的字符結點???
  50. ????????????{?//temp->next[i]?為該結點,temp為其父結點???
  51. ????????????????if(temp==root)//若是第一層中的字符結點,則把該結點的失敗指針指向root???
  52. ????????????????????temp->next[i]->fail=root;??
  53. ????????????????else??
  54. ????????????????{??
  55. ????????????????????//依次回溯該節點的父節點的失敗指針直到某節點的next[i]與該節點相同,??
  56. ????????????????????//則把該節點的失敗指針指向該next[i]節點;???
  57. ????????????????????//若回溯到?root?都沒有找到,則該節點的失敗指針指向?root??
  58. ????????????????????p=temp->fail;//將該結點的父結點的失敗指針給p???
  59. ????????????????????while(p!=NULL)??
  60. ????????????????????{??
  61. ????????????????????????if(p->next[i]!=NULL)??
  62. ????????????????????????{??
  63. ????????????????????????????temp->next[i]->fail=p->next[i];??
  64. ????????????????????????????break;??
  65. ????????????????????????}??
  66. ????????????????????????p=p->fail;??
  67. ????????????????????}??
  68. ????????????????????//讓該結點的失敗指針也指向root???
  69. ????????????????????if(p==NULL)??
  70. ????????????????????????temp->next[i]->fail=root;??
  71. ????????????????}??
  72. ????????????????queue[head++]=temp->next[i];//每處理一個結點,都讓該結點的所有孩子依次入隊???
  73. ????????????}??
  74. ????????}??
  75. ????}??
  76. }??
  77. int?query(Node?*root)??
  78. {?//i為主串指針,p為模式串指針???
  79. ????int?i,v,count=0;??
  80. ????Node?*p=root;??
  81. ????int?len=strlen(s);??
  82. ????for(i=0;i<len;i++)??
  83. ????{??
  84. ????????v=s[i]-'a';??
  85. ????????//由失敗指針回溯查找,判斷s[i]是否存在于Trie樹中???
  86. ????????while(p->next[v]==NULL?&&?p!=root)??
  87. ????????????p=p->fail;??
  88. ????????p=p->next[v];//找到后p指針指向該結點???
  89. ????????if(p==NULL)//若指針返回為空,則沒有找到與之匹配的字符???
  90. ????????????p=root;??
  91. ????????Node?*temp=p;//匹配該結點后,沿其失敗指針回溯,判斷其它結點是否匹配???
  92. ????????while(temp!=root)//匹配結束控制???
  93. ????????{??
  94. ????????????if(temp->cnt>=0)//判斷該結點是否被訪問???
  95. ????????????{??
  96. ????????????????count+=temp->cnt;//由于cnt初始化為?0,所以只有cnt>0時才統計了單詞的個數???
  97. ????????????????temp->cnt=-1;//標記已訪問過???
  98. ????????????}??
  99. ????????????else//結點已訪問,退出循環???
  100. ????????????????break;??
  101. ????????????temp=temp->fail;//回溯?失敗指針?繼續尋找下一個滿足條件的結點???
  102. ????????}??
  103. ????}??
  104. ????return?count;??
  105. }??
  106. int?main()??
  107. {??
  108. ????int?T,n;??
  109. ????scanf("%d",&T);??
  110. ????while(T--)??
  111. ????{??
  112. ????????root=(struct?Node?*)malloc(sizeof(Node));??
  113. ????????Init(root);??
  114. ????????scanf("%d",&n);??
  115. ????????for(int?i=0;i<n;i++)??
  116. ????????{??
  117. ????????????scanf("\n%s",keyword);??
  118. ????????????Build_trie(keyword);??
  119. ????????}??
  120. ????????Build_AC_automation(root);??
  121. ????????scanf("\n%s",s);??
  122. ????????printf("%d\n",query(root));??
  123. ????}??
  124. ????return?0;??
  125. }??
自己留著看的

總結

以上是生活随笔為你收集整理的ac自动机模板(hdu2222)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。