【题目链接】

https://loj.ac/problem/10058

【题意】

对于每一段文字,其前缀在母串上的最大匹配长度是多少呢

【参考别人的题解】

https://www.luogu.org/problemnew/solution/P5231

我们只需要先建立所有密码的trie树
再以母串为主串跑一个AC自动机
不过其中还是有一些需要改动的地方
原本字典树中用来记录某个节点是不是字符串结尾的数组不需要,直接删去
我们需要另一个数组来标记哪些点被匹配
跑完ac自动机后从trie树上找最后一个匹配的点即可
优化:由于nxt数组是递归到0的所以只要有一个点被标记过,那么这个点到0的所有点都已经被遍历过直接退出即可

【自己理解】

其实这个题目就是套路。

1、建模式串的AC自动机。

2、利用文本串跑一遍AC自动机,把对应的位置标记上。

3、再跑一遍模式串,去最长的位置就是答案了。

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M = 2e7 + ;
  6. const int N = 2e5+ ;
  7. char T[M];
  8. char P[N][];
  9. int Trie[M][],Match[M],fail[M],Cnt[M];
  10. int Q[M],Head,Tail;
  11. int n,m,idx=;
  12.  
  13. int calc( char x ){
  14. if( x == 'N' ) return ;
  15. else if( x=='E' ) return ;
  16. else if( x=='S' ) return ;
  17. else return ;
  18. }
  19. void Insert(char s[],int Id){
  20. int p = ;
  21. for(int i=;s[i];i++){
  22. int t = calc(s[i]);
  23. if( !Trie[p][t] )
  24. Trie[p][t] = ++idx ;
  25. p = Trie[p][t];
  26. }
  27. Match[Id] = p ;
  28. }
  29. void Build(){
  30. Head = , Tail = ;
  31. for(int i=;i<;i++) Trie[][i] = ;
  32.  
  33. Q[++Tail] = ;
  34. while( Head <= Tail ){
  35. int u = Q[Head++] ;
  36. for(int i=;i<;i++){
  37. int To = Trie[u][i];
  38. if( To ){
  39. fail[To] = Trie[fail[u]][i];
  40. Q[ ++Tail ] = To ;
  41. }else{
  42. Trie[u][i] = Trie[fail[u]][i];
  43. }
  44. }
  45. }
  46. }
  47. void Query(char T[]){
  48.  
  49. int p = ;
  50. for(int i=;T[i];i++){
  51. p = Trie[p][calc(T[i])];
  52. for(int j=p;j;j=fail[j]){
  53. if( Cnt[j] ) break;
  54. Cnt[j] = ;
  55. }
  56. }
  57.  
  58. for(int i=;i<=m;i++){
  59. int res = , p = ;
  60. for(int j=;P[i][j];j++){
  61. p = Trie[p][calc(P[i][j])];
  62. if( Cnt[p] ) res = j + ;
  63. }
  64. printf("%d\n",res);
  65. }
  66. }
  67. int main()
  68. {
  69. scanf("%d%d",&n,&m);
  70. scanf("%s",T);
  71. for(int i=;i<=m;i++){
  72. scanf("%s",P[i]);
  73. Insert( P[i] , i );
  74. }
  75. Build();
  76. Query(T);
  77. return ;
  78. }

玄武密码

【AC自动机】玄武密码的更多相关文章

  1. [AC自动机]玄武密码

    题目描述 一个长度为\(N\)的母串,有四个元素分别是:N,S,W,N. 有M个长度为100的模式串. 现在要求每个模式串的前缀与母串匹配最长长度. 输入样例 7 3 SNNSSNS NNSS NNN ...

  2. 【BZOJ4327】JSOI2012 玄武密码 AC自动机

    [BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...

  3. BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]

    题目传送门 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神 ...

  4. BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)

    在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  很多年后,人们终于在进香 ...

  5. [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)

    题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  ...

  6. Vijos P1951 玄武密码 (AC自动机)

    描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...

  7. TZOJ 5986 玄武密码(AC自动机)

    描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们终于在 ...

  8. 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)

    2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...

  9. BZOJ4327 JSOI2012玄武密码(AC自动机)

    当然可以在SA上二分答案,但看起来会被卡log.考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点.注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可 ...

随机推荐

  1. IDEA算法导包后 import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey;报错

    仔细查看报错原因就能知道,报错是因为包冲突的原因,可以每种只放一个jar包,就能过避免这种错误. 例如:只导入commons-codec-1.11-javadoc,jar和bcprov-jdk15on ...

  2. Harmonious Graph

    D. Harmonious Graph 好后悔在写这个题之前浪费了几分钟时间,不然我就写出来了.... 因为他就是连通块之间的合并问题,所以就用并查集就好了 复杂度好像也只是线性的吧... 然后就A了 ...

  3. codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...

  4. overflow妙用--去除默认滚动条,内容仍可滚动

    在开发中我们往往要去除默认滚动条,但是其在竖直方向的滚动效果仍然需要. <div id="parent"> <div id="child"&g ...

  5. sql mode 问题及解决 错误代码:1055 this is incompatible with sql_mode=only_full_group_by

    数据库升级到5.7.21后,一个正常的分组后按日期排序,并返回数据的语句开始报错: 语句如下: SELECT id,title,add_time FROM `message` GROUP BY add ...

  6. sass/scss 和 less对比

    一. Sass/Scss.Less是什么? Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,Sass语法属于缩排语法,比css比多出好些功能(如变量 ...

  7. React的Virtual DOM厉害了

    React 的伟大之处就在于,提出了Virtual DOM这种新颖的思路,并且这种思路衍生出了React Native,有可能会统一Web/Native开发. 在性能方面,由于用到了Virtual D ...

  8. win10+mysql8.0安装

    一.下载 mysql8.0 windows zip包下载地址: https://dev.mysql.com/downloads/mysql/   1540951981(1).png 二.安装 1.解压 ...

  9. 如何使用git cherry-pick将同一个仓库的某个分支的某些commit合并到当前分支?

    答: git cherry-pick <another-branch's commit-id>

  10. Vue tree自定义事件注意点

    <template> <div id="Tree_ElementTree" style="height: 100%;"> <el- ...