[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 ...
随机推荐
- Xp 消息队列的使用
1.安装消息队列3.0: 控制面板/添加删除程序/添加window组件/找到消息队列/选择->详细信息->MSMQ HTTP支持. 注意:如果计算机没有连接到域需要去掉Active Dir ...
- SQL Server 语句整理
1. 创建数据库 create database dbName 2. 删除数据库 drop database dbName 3. 备份sql server --- 创建 备份数据的 device US ...
- allegro si(三)
前言:si的教程市面上是很少的,layout是台湾工程师的强项,还有就是日本人,国人爱用AD. si的教程中靠谱的还是张飞的收费课程,还有华为的资料. Cadence SI 仿真实验步骤如下: 1.熟 ...
- 安全增强 Linux (SELinux) 剖析
架构和实现 Linux® 一直被认为是最安全的操作系统之一,但是通过引入安全增强 Linux(Security-Enhanced Linux,SELinux),National Security Ag ...
- Tarjan算法求有向图的强连通分量
算法描述 tarjan算法思想:从一个点开始,进行深度优先遍历,同时记录到达该点的时间(dfn记录到达i点的时间),和该点能直接或间接到达的点中的最早的时间(low[i]记录这个值,其中low的初始值 ...
- Intellij导入外部的jar
File -> Project Structure (ctrl + shift + alt + s ) -> Module -> Dependencies -> Add... ...
- 评价软件_搜狗输入法(pc端)
一.用户界面 用户在初次下载后,会有一个非常简洁的界面,如图:
- Python 练习册--生成唯一激活码(邀请码)
题目是这样子的: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 分析 其实要生成 ...
- HDU 5000
http://acm.hdu.edu.cn/showproblem.php?pid=5000 题意:有n种属性,每种属性的数值可以是0-T[i],当一个人属性全部小于等于另一个人的属性时,小的那个人会 ...
- Selenium - IWebDriver 控制scroll bar到底部
有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉 ...