题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327

题解:

做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推,如果\(fail[x]\)被标记则\(x\)被标记,然后每一个关键点往上找即可

有一个常数优化的技巧: 如果枚举每个\(x\)再vis[fail[x]]|=vis[x]的话好像还需要按深度排序,不如直接每到一个点直接不停地跳fail一路标记,直到遇到已标记点为止

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; const int N = 1e5;
const int LEN = 100;
const int M = 1e7;
const int SIZ = 1e7;
const int S = 4;
char b[N+3][LEN+3];
char a[M+3];
int len[N+3];
int son[SIZ+3][S+3];
int fail[SIZ+3];
int id[SIZ+3];
bool vis[SIZ+3];
int que[SIZ+3];
int ans[N+3];
int n,m,siz; int decode(char x)
{
if(x=='E') return 1;
else if(x=='S') return 2;
else if(x=='W') return 3;
else if(x=='N') return 4;
} void insertstr(int sid)
{
int u = 0;
for(int i=1; i<=len[sid]; i++)
{
if(son[u][b[sid][i]]==0) {siz++; son[u][b[sid][i]] = siz;}
u = son[u][b[sid][i]];
}
id[u] = sid;
} void buildACA()
{
int head = 1,tail = 0;
for(int i=1; i<=S; i++)
{
if(son[0][i]) {tail++; que[tail] = son[0][i];} fail[son[0][i]] = 0;
}
while(head<=tail)
{
int u = que[head]; head++;
for(int i=1; i<=S; i++)
{
if(son[u][i]) {fail[son[u][i]] = son[fail[u]][i]; tail++; que[tail] = son[u][i];}
else {son[u][i] = son[fail[u]][i];}
}
}
} int main()
{
scanf("%d%d",&m,&n);
scanf("%s",a+1); for(int i=1; i<=m; i++) a[i] = decode(a[i]);
for(int i=1; i<=n; i++)
{
scanf("%s",b[i]+1); len[i] = strlen(b[i]+1);
for(int j=1; j<=len[i]; j++) b[i][j] = decode(b[i][j]);
insertstr(i);
}
buildACA();
int u = 0; vis[0] = true;
for(int i=1; i<=m; i++)
{
vis[u] = true;
u = son[u][a[i]];
for(int j=u; vis[j]==false; j=fail[j]) {vis[j] = true;}
}
for(int i=1; i<=n; i++)
{
u = 0;
for(int j=1; j<=len[i]; j++)
{
u = son[u][b[i][j]];
if(!vis[u]) {break;}
ans[i]++;
}
}
for(int i=1; i<=n; i++) printf("%d\n",ans[i]);
return 0;
}

最新文章

  1. 【流量劫持】躲避 HSTS 的 HTTPS 劫持
  2. Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
  3. 笔记--MySQL相关操作
  4. Unity3D 事件
  5. HTML5视频标签video
  6. (剑指Offer)面试题31:连续子数组的最大和
  7. javascript异步加载详解(转)
  8. uva10829 L-Gap Substrings
  9. Win8.1系统下安装nodeJS
  10. C# 特性参数(注解属性加在参数前面)
  11. 发短信utils
  12. socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放
  13. 浏览器渲染原理笔记 --《How Browser Work》读后总结
  14. &lt;%@ Register TagPrefix=&quot;uc1&quot; TagName=&quot;user&quot; Src=&quot;../Control/user.ascx&quot; %&gt;什么意思?
  15. css 颜色表示法
  16. vue二、脚手架搭建
  17. java,利用Selenium调用浏览器,动态模拟浏览器事件,动态获取页面信息
  18. 配合es5.8的使用,升级sb版本到2.X,遇到一个问题
  19. css获取样式
  20. 复杂json的解析:jsonobject与jsonArray的使用

热门文章

  1. HDU4336:Card Collector
  2. 杂项-java:ElasticSearch
  3. Kernel trick----PRML读书笔记
  4. C# MySql 连接
  5. Python的包管理工具easy_install, setuptools, pip,distribute介绍
  6. FTP FtpWebRequest 异步上传文件
  7. 为什么选择Android Studio 而是 Eclipse
  8. Linux下安装Wine 运行、卸载 windows程序
  9. URI、URL、请求、响应、常见状态代码
  10. Coursera公开课-Machine_learing:编程作业8(2016-10-06 20:49)