2016北京集训测试赛(七)Problem A: 自动机

Solution
注意到这一题并不要求字符串最短或者是字典序最小, 因此直接构造就可以了. 我们对于每个点\(u \ne 0\)找到一个串\(S\), 使得\(T(u, S) = T(0, S)\), 时间复杂度为\(O(n^3m)\). 假如我们发现对于某个点无法找到一个这样的串, 则说明无解. 接着我们用一个集合来表示自动机中所有点. 对于每个非零的点, 我们用前面求出来的串将其变成\(0\), 同时用这个串更新集合中的其他节点即可. 总时间复杂度: \(O(n^4 + n^3m)\)
#include <cstdio>
#include <cctype>
#include <cstring>
namespace Zeonfai
{
inline int getInt()
{
int a = 0, sgn = 1;
char c;
while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
}
const int N = 100, M = 26;
int n, m;
struct automaton
{
struct node
{
int edg[M], pth[N * N], len;
}nd[N];
inline void addEdge(int u, int c, int v)
{
nd[u].edg[c] = v;
}
int vis[N][N], flg;
void DFS(int u, int v, int len, int S)
{
vis[u][v] = 1;
if(! u && ! v)
{
flg = 1; nd[S].len = len;
return;
}
for(int i = 0; i < m; ++ i) if(! flg && ! vis[nd[u].edg[i]][nd[v].edg[i]]) nd[S].pth[len] = i, DFS(nd[u].edg[i], nd[v].edg[i], len + 1, S);
}
void getAnswer()
{
for(int i = 1; i < n; ++ i)
{
memset(vis, 0, sizeof(vis));
flg = 0; nd[i].len = -1;
DFS(0, i, 0, i);
if(nd[i].len == -1)
{
puts("[impossible]");
return;
}
}
static int stt[N];
for(int i = 0; i < n; ++ i) stt[i] = i;
while(1)
{
int p = 0;
for(; p < n; ++ p) if(stt[p]) break;
if(p == n) break;
for(int i = 0; i < nd[stt[p]].len; ++ i) putchar('a' + nd[stt[p]].pth[i]);
for(int i = 0; i < n; ++ i) if(stt[i] && i ^ p) for(int j = 0; j < nd[stt[p]].len; ++ j) stt[i] = nd[stt[i]].edg[nd[stt[p]].pth[j]];
stt[p] = 0;
}
}
}G;
int main()
{
#ifndef ONLINE_JUDGE
freopen("automaton.in", "r", stdin);
freopen("automaton.out", "w", stdout);
#endif
using namespace Zeonfai;
n = getInt(), m = getInt();
for(int i = 0; i < n; ++ i) for(int j = 0; j < m; ++ j) G.addEdge(i, j, getInt());
G.getAnswer();
}
2016北京集训测试赛(七)Problem A: 自动机的更多相关文章
- 2016北京集训测试赛(十七)Problem C: 数组
Solution 线段树好题. 我们考虑用last[i]表示\(i\)这个位置的颜色的上一个出现位置. 考虑以一个位置\(R\)为右端点的区间最远能向左延伸到什么位置: \(L = \max_{i \ ...
- 2016北京集训测试赛(十七)Problem B: 银河战舰
Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...
- 2016北京集训测试赛(十七)Problem A: crash的游戏
Solution 相当于要你计算这样一个式子: \[ \sum_{x = 0}^m \left( \begin{array}{} m \\ x \end{array} \right) \left( \ ...
- 2016北京集训测试赛(十六)Problem C: ball
Solution 这是一道好题. 考虑球体的体积是怎么计算的: 我们令\(f_k(r)\)表示\(x\)维单位球的体积, 则 \[ f_k(1) = \int_{-1}^1 f_{k - 1}(\sq ...
- 2016北京集训测试赛(十六)Problem B: river
Solution 这题实际上并不是构造题, 而是一道网络流. 我们考虑题目要求的一条路径应该是什么样子的: 它是一个环, 并且满足每个点有且仅有一条出边, 一条入边, 同时这两条边的权值还必须不一样. ...
- 2016北京集训测试赛(十六)Problem A: 任务安排
Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...
- BZOJ 4543 2016北京集训测试赛(二)Problem B: thr 既 长链剖分学习笔记
Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...
- 2016北京集训测试赛(十四)Problem B: 股神小D
Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...
- 2016北京集训测试赛(十四)Problem A: 股神小L
Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...
随机推荐
- Redis实现之服务器
命令请求的执行过程 一个命令请求从发送到获得回复的过程中,客户端和服务器需要完成一系列操作.举个栗子,如果我们使用客户端执行以下命令: 127.0.0.1:6379> SET KEY VALUE ...
- 安恒月赛 image up
http://101.71.29.5:10007/index.php?page=login 仔细观察这个url的话会发现,存在文件包含. 而且并没有login.php而是login,猜测代码是 < ...
- github 上传项目
注册账户以及创建仓库 要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之 ...
- 聊聊、SpringBoot 静态资源访问
SpringBoot 1.X 版本和 SpringBoot 2.X 版本在静态资源访问上有一些区别,如果直接从 1.X 升级到 2.X 肯定是有问题的.这篇文章就来讲讲这方面问题,也是项目中的坑. 先 ...
- [oldboy-django][6其他]navicat远程登录没有权限
day6-17-1204 # 增加远程访问mysql的权限(就是其他ip地址远程访问另外一个ip地址的数据库) -- step1 修改配置文件,bind_address, 允许所有ip地址都可以访问m ...
- nyoj 题目17 单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...
- jquery版右下角弹窗效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- LAMP第二部分apache的配置
1. 下载discuz! mkdir /data/wwwcd /data/wwwmv /root/Discuz_X3.2_SC_GBK.zip .wget http://download.comsen ...
- Juice Junctions
Juice Junctions 题目描述 你被雇佣升级一个旧果汁加工厂的橙汁运输系统.系统有管道和节点构成.每条管道都是双向的,且每条管道的流量都是11升每秒.管道可能连接节点,每个节点最多可以连接3 ...
- python获取目录下文件夹名称
path = '/opt' dirs = os.listdir(path) for dir in dirs: print dir