[AC自动机]题目合计
我只是想记一下最近写的题目而已喵~
题解什么的才懒得写呢~
[poj 1625]Censored!
这题注意一个地方,就是输入数据中可能有 ASCII 大于 128 的情况,也就是说用 char 读入时,这个字符的值为负数,真是 RE 了好久……
可以像我一样 map 党,你也可以把每个 s[i] 都加上 128
#include <cstdio>
#include <cstring>
#include <map>
#define max(x, y) ((x)>(y) ? (x):(y))
const int digit=;
const int sizeOfLen=;
const int sizeOfMemory=;
const int sizeOfType=; struct bigint
{
int len;
int a[];
inline bigint():len() {memset(a, , sizeof(a));}
inline bigint & operator = (int x) {a[]=x; return *this;}
inline bigint & operator += (bigint x)
{
len=max(len, x.len);
for (int i=;i<len;i++)
{
a[i]+=x.a[i];
a[i+]+=a[i]/digit;
a[i]%=digit;
}
for ( ;a[len];len++) a[len+]=a[len]/digit, a[len]%=digit;
return *this;
}
inline void print()
{
printf("%d", a[len-]);
for (int i=len-;i>=;i--) printf("%08d", a[i]);
putchar('\n');
}
}; int N, M, P;
char str[sizeOfLen];
bigint f[sizeOfLen][sizeOfMemory];
std::map<char, int> ord;
inline void dynamicProgram(); namespace trieDfa
{
struct node
{
int order;
bool end;
node * fail;
node * ch[sizeOfType];
};
node memory[sizeOfMemory]; int port;
node * dfa=memory;
inline node * newnode()
{
node * ret=memory+port;
ret->order=port++;
ret->end=;
ret->fail=NULL;
memset(ret->ch, , sizeof(ret->ch));
return ret;
}
inline void clear() {port=; dfa=newnode();} inline void insert(char * s)
{
int len=strlen(s);
node * t=dfa;
for (int i=;i<len;i++)
{
if (!t->ch[ord[str[i]]]) t->ch[ord[str[i]]]=newnode();
t=t->ch[ord[str[i]]];
}
t->end=;
}
inline void buildDfa()
{
static node * queue[sizeOfMemory];
int l=, r=; dfa->fail=dfa;
for (int i=;i<N;i++)
if (!dfa->ch[i]) dfa->ch[i]=dfa;
else dfa->ch[i]->fail=dfa, queue[r++]=dfa->ch[i]; for ( ;l<r; )
{
node * u=queue[l++];
u->end|=u->fail->end;
for (int i=;i<N;i++)
if (u->ch[i])
{
u->ch[i]->fail=u->fail->ch[i];
queue[r++]=u->ch[i];
}
else
u->ch[i]=u->fail->ch[i];
}
}
} int main()
{
scanf("%d %d %d", &N, &M, &P);
scanf("%s", str);
for (int i=;i<N;i++) ord[str[i]]=i;
trieDfa::clear();
for (int i=;i<P;i++)
{
scanf("%s", str);
trieDfa::insert(str);
} dynamicProgram(); return ;
}
inline void dynamicProgram()
{
bigint ret; trieDfa::buildDfa(); f[][]=;
for (int i=;i<M;i++)
for (int j=;j<trieDfa::port;j++)
for (int k=;k<N;k++) if (!trieDfa::dfa[j].ch[k]->end)
f[i+][trieDfa::dfa[j].ch[k]->order]+=f[i][j];
ret=;
for (int i=;i<trieDfa::port;i++) if (!trieDfa::dfa[i].end)
ret+=f[M][i];
ret.print();
}
本傻装B系列1
[hdu 2896]病毒侵袭
这真是裸体,而且数据没有 poj 那道丧心病狂
#include <cstdio>
#include <cstring>
const int sizeOfVirus=;
const int sizeOfText=;
const int sizeOfType=;
const int sizeOfMemory=; int N, M;
char str[sizeOfText];
int virus[sizeOfMemory];
bool vis[sizeOfVirus]; namespace IOspace
{
inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline void putint(int num)
{
char stack[];
register int top=;
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
}
} namespace trieDfa
{
struct node
{
int order;
bool end;
node * fail, * last;
node * ch[sizeOfType];
};
node memory[sizeOfMemory]; int port;
node * dfa=memory;
inline node * newnode()
{
node * ret=memory+port;
ret->order=port++;
ret->end=false;
ret->fail=ret->last=NULL;
memset(ret->ch, , sizeof(ret->ch));
return ret;
}
inline void clear() {port=; dfa=newnode();} inline void insert(char * s, int k)
{
int len=strlen(s);
node * t=dfa;
for (int i=;i<len;i++)
{
if (!t->ch[s[i]]) t->ch[s[i]]=newnode();
t=t->ch[s[i]];
}
t->end=true;
virus[t->order]=k;
}
inline void buildDfa()
{
static node * queue[sizeOfMemory];
int l=, r=; dfa->fail=dfa;
for (int i=;i<sizeOfType;i++)
if (!dfa->ch[i]) dfa->ch[i]=dfa;
else dfa->ch[i]->fail=dfa, queue[r++]=dfa->ch[i]; for ( ;l<r; )
{
node * u=queue[l++];
for (int i=;i<sizeOfType;i++)
if (u->ch[i])
{
u->ch[i]->fail=u->fail->ch[i];
u->ch[i]->last=u->ch[i]->fail->end?u->ch[i]->fail:u->ch[i]->fail->last;
queue[r++]=u->ch[i];
}
else
u->ch[i]=u->fail->ch[i];
}
}
inline bool search(char * s)
{
bool flag=;
int len=strlen(s); node * t=dfa;
memset(vis, , sizeof(vis));
for (int i=;i<len;i++)
{
t=t->ch[s[i]];
if (t->end) vis[virus[t->order]]=flag=true;
for (node * j=t->last;j;j=j->last)
vis[virus[j->order]]=flag=true;
} return flag;
}
} int main()
{
int tot=; N=IOspace::getint();
trieDfa::clear();
for (int i=;i<=N;i++)
{
scanf("%s", str);
trieDfa::insert(str, i);
}
trieDfa::buildDfa(); M=IOspace::getint();
for (int i=;i<=M;i++)
{
scanf("%s", str);
bool flag=trieDfa::search(str);
tot+=flag; if (flag)
{
printf("web %d:", i);
for (int i=;i<=N;i++) if (vis[i])
putchar(' '), IOspace::putint(i);
putchar('\n');
}
}
printf("total: %d\n", tot); return ;
}
本傻装B系列2
[AC自动机]题目合计的更多相关文章
- AC自动机-题目集合
AC自动机-题目集合 模板 如果你想要学习AC自动机,推荐一些学习资料. 学习可以看这篇博客 http://blog.csdn.net/niushuai666/article/details/7002 ...
- KMP,Trie,AC自动机题目集
字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的.字符串的题目灵活多变也有许多套路,需要多做题才能体会.这里收集了许多前辈的题目做个集合,方便自己回忆. KMP题目:https:// ...
- AC自动机题目汇总
POJ 4052 ZJU 3430 HDU 4117 HNU 10104 HDU 2457 HNU 11187 ZJU 3545 HDU 3341
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects
图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...
- bzoj 2754 ac自动机
第一道AC自动机题目. 记一下对AC自动机的理解吧: AC自动机=Trie+KMP.即在Trie上应用KMP思想,实现多Pattern的匹配问题. 复杂度是预处理O(segma len(P)),匹配是 ...
- 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机
[bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...
- AC自动机题单
AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808][模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P38 ...
随机推荐
- mybatis写mapper文件注意事项(转)
原文链接:http://wksandy.iteye.com/blog/1443133 xml中某些特殊符号作为内容信息时需要做转义,否则会对文件的合法性和使用造成影响 < < > & ...
- php注册审核显示
用户进行注册,管理员通过审核后,使用户通过审核 数据库建表 create database mydb; use mydb; create table User ( Uid int auto_incre ...
- 《hanoi(汉诺塔)问题》求解
//Hanoi(汉诺)塔问题.这是一个古典的数学问题,用递归方法求解.问题如下: /* 古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和 ...
- leetcode 233 Number of Digit One
这题属于需要找规律的题.先想一下最简单的情形:N = 10^n - 1 记X[i]表示从1到10^i - 1中 1 的个数,则有如下递推公式:X[i] = 10 * X[i - 1] + 10^(i ...
- 简单实现web单点登录
主要参考文档:http://blog.csdn.net/jimmy609/article/details/18605781 1.工程总体结构: 2.修改C:\Windows\System32\driv ...
- S50非接触式IC卡性能简介(M1)
一.主要指标 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位: 每个扇区有独立的一组密码及访问控制: 每张卡有唯一序列号,为32位: 具有防冲突机制,支持多卡操作: 无电源,自带天线, ...
- php大力力 [010节]PHP常量
2015-08-23 php大力力010. PHP常量 php大力力 [010节]PHP常量 设置 PHP 常量 如需设置常量,请使用 define() 函数 - 它使用三个参数: 首个参数定义常量的 ...
- BZOJ 2296 随机种子
RT. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- win7下环境搭建
1.Python下载 https://www.python.org/downloads/windows/ 选择需要安装的版本,我偷懒装的可执行文件. 下载之后双击安装就OK啦,安装过程中有一项偷懒的选 ...
- Squid代理之反向代理
(一) 为Internet用户访问企业Web站点提供缓存加速. 1 关闭防火墙