【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)

题面

BZOJ

洛谷

题解

裸的广义后缀自动机???

建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括了

然后读入串直接匹配就好了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 111111
struct Node
{
int son[26];
int ff,len;
}t[MAX<<1];
int last=1,tot=1;
void extend(int c)
{
int p=last,np=++tot;last=np;
t[np].len=t[p].len+1;
while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff;
if(!p)t[np].ff=1;
else
{
int q=t[p].son[c];
if(t[q].len==t[p].len+1)t[np].ff=q;
else
{
int nq=++tot;
t[nq]=t[q];t[nq].len=t[p].len+1;
t[q].ff=t[np].ff=nq;
while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;
}
}
}
string s[MAX],c;
int n,m;
int vis[MAX<<1],size[MAX<<1];
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;++i,last=1)
{
cin>>s[i];
for(int j=0,l=s[i].length();j<l;++j)extend(s[i][j]-97);
}
for(int i=1;i<=n;++i)
{
int now=1;
for(int j=0,l=s[i].length();j<l;++j)
{
now=t[now].son[s[i][j]-97];
int u=now;
while(u&&vis[u]!=i)vis[u]=i,++size[u],u=t[u].ff;
}
}
for(int i=1;i<=m;++i)
{
cin>>c;
int now=1;
for(int j=0,l=c.length();j<l;++j)
now=t[now].son[c[j]-97];
printf("%d\n",size[now]);
}
return 0;
}

最新文章

  1. 如何进行安全测试-XSS篇
  2. yii2.0邮箱发送
  3. Cracking the coding interview 第二章问题及解答
  4. Impala与Hive的比較
  5. 克鲁斯卡尔(Kruskal)算法
  6. 创建XML文件
  7. 把perl脚本编译成exe
  8. Safari无痕模式是不能只使用localStorage存储数据要用Cookie做补丁
  9. Prometheus使用入门
  10. jQuery (02) 重点知识点总结
  11. IDEA汉化教程
  12. DataGrid获取单元格的值
  13. 莫烦scikit-learn学习自修第一天【scikit-learn安装】
  14. Redis设置内存最大占用值
  15. jdk8新特性(详解)
  16. Unix/Linux中/usr目录的由来
  17. 转:【专题四】自定义Web浏览器
  18. RAMOS_XP制作教程
  19. Rocket MQ 问题排查命令
  20. CSS3圆角,阴影,透明

热门文章

  1. grep 文件内容搜索
  2. GitHub中webhooks的使用
  3. C、C++字符操作归总
  4. Phaser游戏框架与HTML Dom元素之间的通信交互
  5. PHP自定义生成二维码跳转地址
  6. 433. Number of Islands【LintCode java】
  7. oracle时间转换查询
  8. 关于css文字的扩展
  9. 吴恩达机器学习笔记——正规方程(Normal Equation)
  10. Alpha发布——视频博客