我好菜啊

AC自动机都不会

AC自动机可以干什么:

用一个模板串匹配多个子串。

这便让AC自动机可以干许多KMP和Tri树不能干的事。

AC自动机的构造

首先建立一颗Trie树。

其次利用KMP的思想(Trie树上明显有许多重复的子路径)

建立一条Fail边

使得这些子路径没有白跑。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
struct Results{int num;int pos;
}Ans[N];
string s[N];
bool operator < (Results A,Results B){return A.num>B.num||(A.num==B.num&&A.pos<B.pos);
}
struct A_C_Automation{struct Node{int fail;int end;int vis[28]; }AC[N];int cnt;inline void Clear(int p){memset(AC[p].vis,0,sizeof(AC[p].vis));AC[p].fail=0;AC[p].end=0;}inline void Build(string S,int Id){
//      cout<<"We _ in"<<'\n';int now=0;//=AC[0].vis[S[0]-'a'];int R=S.length();for(int i=0;i<R;i++){
//          cout<<" id = "<<i<<'\n';if(!AC[now].vis[S[i]-'a']){cnt++;AC[now].vis[S[i]-'a']=cnt;Clear(cnt);}now=AC[now].vis[S[i]-'a'];}
//      cout<<Id<<" Id "<<'\n';AC[now].end=Id;}inline void Get_Fail(){queue<int> Q;for(int i=0;i<27;i++){if(AC[0].vis[i]){AC[AC[0].vis[i]].fail=0;Q.push(AC[0].vis[i]);}}while(!Q.empty()){int u=Q.front();Q.pop();for(int i=0;i<27;i++){if(AC[u].vis[i]){AC[AC[u].vis[i]].fail=AC[AC[u].fail].vis[i];Q.push(AC[u].vis[i]);}else AC[u].vis[i]=AC[AC[u].fail].vis[i];}}}inline void Query(string S){int R=S.length();int now=0;int ans=0;for(int i=0;i<R;i++){now=AC[now].vis[S[i]-'a'];for(int t=now;t;t=AC[t].fail)Ans[AC[t].end].num++;}}
}ACM;
int main(){ios::sync_with_stdio(false);
//  freopen("AC_AUTO.in","r",stdin);
//  int T;
//  scanf("%d",&T);while(233){ACM.Clear(0);int n;cin>>n;if(n==0)break;ACM.cnt=0;
//      cout<<n<<'\n';
//      scanf("%d",&n);
//      cout<<"here"<<'\n';for(int i=1;i<=n;i++){cin>>s[i];
//          cout<<"hello "<<'\n';Ans[i].num=0;Ans[i].pos=i;ACM.Build(s[i],i);}
//      cout<<"here"<<'\n';ACM.AC[0].fail=0;ACM.Get_Fail();string Key;cin>>Key;ACM.Query(Key);sort(&Ans[1],&Ans[n+1]);
//      for(int i=1;i<=n;i++){
//          cout<<Ans[i].num<<" ";
//      }cout<<Ans[1].num<<'\n';cout<<s[Ans[1].pos]<<'\n';for(int i=2;i<=n;i++){if(Ans[i-1].num==Ans[i].num){cout<<s[Ans[i].pos]<<'\n';}else break;}
//      cout<<'\n';
//      cout<<"end one "<<'\n';}return 0;
}

转载于:https://www.cnblogs.com/Leo-JAM/p/10079195.html

省选专练(学习)AC自动机相关推荐

  1. 省选专练之后缀自动机SPOJ1811LCS - Longest Common Substring

    陈老师引入SAM的例题 求两个串的LCS 直接建一个串的SAM,并且把另外一个串放进去跳. 这个方法很经典! 几乎满足了所有两个串的公共串问题的所有解法 有巨子说这个跳是均摊Log的,我也不知道QwQ ...

  2. 省选专练(学习)可持久化Trie树(BZOJ3261)

    这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...

  3. 网络流学习总结和省选专练SCOI2015小凸玩矩阵

    这是四川连着第几个年头考二分套网络流了? 虽然这是一个二分图最大匹配,但是我匈牙利写挂了. 我太弱了. 好了不瞎扯牛逼了,这个题这么搞: 首先题目就告诉你求第k大最小. 首先这就让人瑟瑟发抖....第 ...

  4. R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块

    我好菜啊100+60+30 滚犊子吧,两天加起来才410搞个屁我一年前都可以考400 不说了,题毕竟比较难 T1还是水题但是比昨天难 这是一个开绝对值不等式的题. 根据对奇数和偶数的最优根的归纳一定有 ...

  5. 省选专练 【BZOJ4773】负环

    可耻的苟到数据后搞了一波题 首先标解绝对不是倍增floyd 这是n^3logn的算法 二分+DFS_SPFA是nlogn的算法 但是在学习嘛 所谓标解: #include<bits/stdc++ ...

  6. 省选专练之文艺计算姬

    "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬. 文艺计算姬比普通计算机有更多的艺术细胞. 普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一 ...

  7. 省选专练[CQOI2007]涂色

    不好理解的DP 伪区间DP F(i,j)表示子串i-j实现的方式最小 当i=j时明显为1 当s[i]==s[j]时 这里是理解的重难点: 通过递归可知当你刷i的时候顺便刷到j就好了 然后就是标准的区间 ...

  8. 省选专练之神仙贪心IOI2013Robert

    [问题描述] 小沐把玩具扔在地板上,乱七八糟.庆幸的是,有一种特殊的机器人可以收拾玩具.不过他需要 确定哪个机器人去拣哪个玩具. 一共有 T 个玩具,整数 w[i]表示这个玩具的重量,整数 s[i]表 ...

  9. 省选专练[POI2005]SAM-Toy Cars

    经典贪心 策略如下: 每次贪心让最需要的放下 易证正确 #include<bits/stdc++.h> using namespace std; const int N=1e6; inli ...

最新文章

  1. 为什么要读源代码,如何阅读源代码
  2. 《Go语言从入门到实战》学习笔记(1)——Go语言学习路线图、简介
  3. liferay7.0 mysql_Liferay7 BPM门户开发之6: Activiti数据库换为mysql
  4. Jsp页面中常用的EL表达式
  5. 解决Visual Studio 2017隐藏“高级保存选项”命令
  6. 网页标准HTML5标准较量正酣
  7. python处理excel的方法有哪些_python简单处理excel方法
  8. matlab在电力系统潮流计算程序,大神们,求个电力系统潮流计算的matlab程序。
  9. Kotlin入门(21)活动页面的跳转处理
  10. 泛微oa部署linux步骤,泛微oa部署微搜功能手册
  11. 公差带与配合 常用基孔(轴)制基准公差数值
  12. 年底无心工作?给个摸鱼好去处。中国超级英雄【一方净土】,进来看看嘛
  13. PyQt5简易本地视频播放器
  14. Unity VFX学习系列 —— 效果制作(烟花)
  15. 在ubuntu18.04 上使用键盘鼠标共享软件 Synergy
  16. 中高级iOS大厂面试宝典,进厂率80%,金三银四将是你的新起点
  17. ❤️小白到精英必备的100多个Python函数汇总❤️写代码都流畅多了
  18. MacOS Excel 科研作图示例
  19. MFC双人版俄罗斯方块
  20. 如何删除需要使用管理员权限才能删除的文件?

热门文章

  1. JavaFX SceneBuilder设置按钮的背景颜色
  2. JavaFX BorderPane布局代码示例
  3. 【代码】CyclicBarrier栅栏使用示例
  4. Scala隐式参数(隐式值)
  5. Scala import导包用法
  6. Linux vim取消高亮显示
  7. JVM年轻代参数:-Xmn、-XX:NewSize、-XX:MaxNewSize
  8. redis集群方式介绍
  9. java中的重写与重载_java中的重写与重载
  10. windows 下conda安装gym