LOJ BZOJ

题目大意:给你一些模式串,问是否存在一个无限长的文本串,不包含任何一个给定的模式串

并没有想到去模拟合法的文本串在模式串的Trie图上匹配的过程..我好菜啊

如果一个字符串合法,那么它的每个子串都不是任何一个模式串的结尾,即沿着Fail链跳到根的每个点都不是结尾

一个合法文本串在模式串构成的Trie图上匹配的过程中,会不断沿着一个环去跳

如果一个环合法,那么这个环需要满足环上每个点,以及根节点到第一个接触到环的路径上的每个点,都合法

找合法环的过程中,可以用类似于tarjan边双的方法,用两个数组记录那些点被访问过,以及那些点在栈中

 #include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NN 30010
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define inf 0x3f3f3f3f
#define idx(x) (x-'0')
using namespace std; int n;
char str[NN];
int head[NN],nt[NN],vis[NN],use[NN],cte;
struct Edge{int to,nxt;}edge[NN*];
void ae(int u,int v){
cte++;edge[cte].nxt=head[u];
edge[cte].to=v,head[u]=cte;
}
struct AC{
int fail[NN],g[NN],ch[NN][],ed[NN],tot;
void Build_Trie(char *a,int len)
{
int x=;
for(int i=;i<=len;i++){
if(!ch[x][idx(a[i])])
ch[x][idx(a[i])]=++tot;
x=ch[x][idx(a[i])];
}ed[x]=;
}
void Build_Fail()
{
queue<int>q;
if(ch[][]) q.push(ch[][]);
if(ch[][]) q.push(ch[][]);
while(!q.empty())
{
int x=q.front();q.pop();
ae(fail[x],x);
for(int i=;i<;i++){
if(ch[x][i]){
fail[ch[x][i]]=ch[fail[x]][i];
q.push(ch[x][i]);
}else{
ch[x][i]=ch[fail[x]][i];
}
}
}
q.push();
while(!q.empty())
{
int x=q.front();q.pop();
for(int j=head[x];j;j=edge[j].nxt){
int v=edge[j].to;
if(ed[v]||g[x]) g[v]=;
q.push(v);
}
}
}
int find_cir(int x)
{
if(vis[x]) return ;
vis[x]=,use[x]=;
int ans=;
for(int i=;i<;i++){
if(use[ch[x][i]]) return ;
if(!g[ch[x][i]])
ans=find_cir(ch[x][i]);
if(ans) return ;
}use[x]=;return ;
}
void solve()
{
for(int i=;i<=n;i++){
scanf("%s",str+);
int len=strlen(str+);
Build_Trie(str,len);
}Build_Fail();
int ans=;
ans=find_cir(ch[][]);
if(ans){printf("TAK\n");return;}
memset(vis,,sizeof(vis));
ans=find_cir(ch[][]);
if(ans){printf("TAK\n");return;}
printf("NIE\n");
}
}ac; int main()
{
//freopen("t2.in","r",stdin);
scanf("%d",&n);
ac.solve();
return ;
}

最新文章

  1. ContentProvider中央档案馆,以及获取联系人电话的示例
  2. 前端之float的几种清除浮动方式
  3. Spring注入JPA+JPA事务管理
  4. a chip multiprocessor
  5. vim的寄存器和剪贴簿操作?
  6. android setCompoundDrawables 不显示问题
  7. POJ 2112 - Optimal Milking
  8. SQL表名,应该用复数还是单数
  9. Socket规划(1)
  10. Python快速入门(3)
  11. 【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引
  12. NumPy 超详细教程(1):NumPy 数组
  13. docker~swarm搭建docker高可用集群
  14. django--use
  15. 想拥有自己的Python程序包,你只需15步
  16. 对于python setup.py install安装的包如何卸载
  17. Java基础 【Math、Random、System、BigInteger、BigDecimal、Date、Calendar等常用类的使用】
  18. JVM学习记录-Java内存模型(二)
  19. 学习IIS &amp; MVC的运行原理 (转)
  20. 算法与数据结构实验题 6.4 Summary

热门文章

  1. easyui的增删改
  2. 怎样验证layer.prompt输入的值为数值型???
  3. webpack——react
  4. Spark 代码走读之 Cache
  5. web 安全主题
  6. BZOJ 1856 [SCOI2010]生成字符串 (组合数)
  7. Linux之awk使用
  8. Python 绘图与可视化 matplotlib 制作Gif动图
  9. SpringCloud 构建微服务架构-练习
  10. c++变量的作用域、生存期和可见性