hnu10104
AC自动机+DFS
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std; #define D(x) const int MAX_LEN = * (1e4) + ;
const int MAX_NODE_NUM = MAX_LEN;
const int MAX_CHILD_NUM = ; struct Trie
{
int next[MAX_NODE_NUM][MAX_CHILD_NUM];
int fail[MAX_NODE_NUM];
int node_cnt;
bool vis[MAX_NODE_NUM]; //set it to false
bool virus[MAX_NODE_NUM];
int root; void init()
{
node_cnt = ;
root = newnode();
memset(vis, , sizeof(vis));
memset(virus, , sizeof(virus));
} int newnode()
{
for (int i = ; i < MAX_CHILD_NUM; i++)
next[node_cnt][i] = -;
virus[node_cnt++] = false;
return node_cnt - ;
} int get_id(char a)
{
return a - '';
} void insert(char buf[])
{
int now = root;
for (int i = ; buf[i]; i++)
{
int id = get_id(buf[i]);
if (next[now][id] == -)
next[now][id] = newnode();
now = next[now][id];
}
virus[now] = true;
D(printf("virus[%d] = %d\n", now, virus[now]));
} void build()
{
queue<int>Q;
fail[root] = root;
for (int i = ; i < MAX_CHILD_NUM; i++)
if (next[root][i] == -)
next[root][i] = root;
else
{
fail[next[root][i]] = root;
Q.push(next[root][i]);
}
while (!Q.empty())
{
int now = Q.front();
Q.pop();
for (int i = ; i < MAX_CHILD_NUM; i++)
if (next[now][i] == -)
next[now][i] = next[fail[now]][i];
else
{
fail[next[now][i]]=next[fail[now]][i];
if (virus[fail[next[now][i]]])
virus[next[now][i]] = true;
Q.push(next[now][i]);
}
}
} bool dfs(int u)
{
D(printf("%d\n", u));
vis[u] = true;
for (int i = ; i < MAX_CHILD_NUM; i++)
{
int v = next[u][i];
D(printf(" %d\n", v));
if (virus[v])
continue;
if (vis[v])
return true;
if (dfs(v))
return true;
}
vis[u] = false;
return false;
} void debug()
{
for(int i = ;i < node_cnt;i++)
{
printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],virus[i]);
for(int j = ;j < MAX_CHILD_NUM;j++)
printf("%2d",next[i][j]);
printf("]\n");
}
}
}ac; char st[MAX_LEN];
int n; int main()
{
scanf("%d", &n);
ac.init();
for (int i = ; i < n; i++)
{
scanf("%s", st);
ac.insert(st);
}
ac.build();
memset(ac.vis, , sizeof(ac.vis));
if (ac.dfs(ac.root))
puts("TAK");
else
puts("NIE");
return ;
}
hnu10104的更多相关文章
随机推荐
- .net3.5后新增的 BeginInvoke EndInvoke 异步操作
protected void Main() { //首先定义一个方法的封装..后边的LongTimeMethod是被封装的方法.. Func<int> longTimeAction = n ...
- 修改ubuntu DNS的步骤/wget url报错: unable to resolve host address的解决方法
wget url 报错:unable to resolve host address ‘url’,显然是无法解析主机地址,这就能看出是DNS解析的问题.解决办法就是配置可用的dns 一般是修改成为谷歌 ...
- axure新手入门教程
首先做个声明:此次教程里为了快速完成,借用了一些网上已有教程的图文,不是剽窃,只图方便.另外,因为汉化版本可能功能名称等略有差别,请自行理解. 名词解释: 线框图:一般就是指产品原型,比如:把线框图尽 ...
- iOS开发 关于SEL的简单总结
SEL就是对方法的一种包装.包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法.在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就 ...
- iOS 生命周期
应用生命周期 App启动:当App启动时,首先由not running状态切换到inactive状态,此时调用application:didFinishLaunchingWithOptions: ...
- Linux系统改变ls文件和文件夹颜色方法
本人之前就针对蓝色文件夹的颜色 我是这样修改的: cp /etc/DIR_COLORS ~/.dir_colors vim ~/.dir_colors , 将DIR 01;33 ...
- 通过Canvas及File API缩放并上传图片完整示例
<!DOCTYPE html> <html> <head> <title>通过Canvas及File API缩放并上传图片</title> ...
- php加速运行优化
一个系统的运行性能,除了程序本身要写的完善,还有要看php本身的一些问题,对于php的运行优化,主要有这些加速器:wincache,xcache,ZendOPcache,eAccelerator加速器 ...
- Latex 数学符号表
- Oracle的分区操作和修改分区主键
1.增加一个分区ALTER TABLE sales ADD PARTITION jan96 VALUES LESS THAN ( '01-FEB-1999' ) TABLESPACE tsx;增加一个 ...