bzoj2938 poi病毒 AC自动机
2024-08-28 11:22:00
思路:
要求构建一个字符串,使得这个字符串不包含给出的任意一个单词。
如果我们已经构建出了一个安全代码,放在ac自动机上跑,那么我们必定不能得到任何一个字符串,此时我们得到的fail指针必定是在一个环上循环,并且这个环不包含单词的末尾。
我们也知道fail指针最后是会指回0点的,那么此时我们其实就是要求一个环,这个换不包含单词末尾即可。加一个优化就是,如果fail指针指向的地方是末尾,那么这个地方等同于末尾。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
char s[maxn],p[maxn];
int trie[maxn][],cntword[maxn],fail[maxn],cnt=;
int n;
bool vis[maxn],ins[maxn];
void insert(char *s){
int root=;
int si=strlen(s);
for(int i=;i<si;i++)
{
int Next=s[i]-'';
if(!trie[root][Next])trie[root][Next]=++cnt;
root=trie[root][Next];
}
cntword[root]++;
}
void getfail(){
queue<int >q;
for(int i=;i<=;i++)
{
if(trie[][i]){
q.push(trie[][i]);
}
}
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=;i<=;i++)
{
if(trie[now][i]){
fail[trie[now][i]]=trie[fail[now]][i];
if(cntword[fail[trie[now][i]]])cntword[trie[now][i]]=;//如果fail指针指向的是病毒的末尾,那么这个也是病毒
q.push(trie[now][i]);
}else{
trie[now][i]=trie[fail[now]][i];
}
}
}
} void init(){
clr(trie,);
clr(cntword,);
clr(ins,),clr(vis,);
}
bool dfs(int u)
{
ins[u]=;
for(int i=;i<=;i++)
{
int v=trie[u][i];
if(ins[v]==)return true;
if(vis[v]||cntword[v])continue;
vis[v]=;
if(dfs(v))return true;
}
ins[u]=;
return false;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",p);
insert(p);
}
fail[]=;
getfail();
if(dfs())puts("TAK");
else puts("NIE"); }
最新文章
- Android之Inflate()
- 学习mongo系列(八)密码与权限
- Effective C++:条款27——条款
- ubuntu 安装遇到黑屏
- HDU - 2290 Find the Path(最短路)
- websocket 70K连接测试
- 创建文件DSN
- 浅谈 maxMemory , totalMemory , freeMemory 和 OOM 与 native Heap
- 1171: lfx捧杯稳啦!
- 【BZOJ2655】calc DP 数学 拉格朗日插值
- tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新ON UPDATE CURRENT_TIMESTAMP列的解决办法
- Hive中MetaServer与HiveServer2的应用
- js--函数声明和函数表达式--执行顺序
- vue-cli中理不清的assetsSubDirectory 和 assetsPublicPath
- C# 条件表达式max=(a>;b)?a:b;含义
- Spring MVC之DispatcherServlet初始化详解
- 1L - ASCII码排序
- Moscow Subregional 2013. 部分题题解 (6/12)
- STA分析(四) lib model
- Python:在windows下创建虚拟环境
热门文章
- asp.net web api 2框架揭秘文摘
- Arch Linux freemind中文乱码
- 编写高质量代码改善C#程序的157个建议——建议121:为应用程序设定运行权限
- linux和windows下的命令
- Backup--备份基础理论
- .net core i上 K8S(七).netcore程序的服务发现
- 2、ASP .NETCore 2.0之视图
- sharepoint用户信息同步出错
- mongodb driver2.5环境注意事项
- .net 抽象类(abstract)和接口(interface)区别