UVa 517 Word 题目描述题目要求模拟一个长度为nnn的循环单词的演化过程。单词由字母a和b组成循环意味着首尾相邻。每个位置iii的下一状态由该位置及其左右邻居位置i−2i-2i−2、iii、i1i1i1的当前字母共同决定共有2382^3 8238种可能组合每种组合对应一个输出字母a或b。给定初始单词和演化步数ssssss可达2×1092 \times 10^92×109输出经过sss步后字典序最小的循环等价单词。输入格式每个数据块包含第一行整数nnn2n162 n 162n16。第二行长度为nnn的字符串由a和b组成。接下来888行每行一个长度为444的字符串c1c2c3c4c_1c_2c_3c_4c1​c2​c3​c4​表示规则若模式c1c2c3c_1c_2c_3c1​c2​c3​匹配则输出c4c_4c4​。最后一行整数sss0≤s≤2×1090 \le s \le 2 \times 10^90≤s≤2×109。输入以文件结束符EOF\texttt{EOF}EOF终止。输出格式对于每个数据块输出一行即sss步后字典序最小的循环等价单词。样例输入5 aaaaa aaaa aaab aabb abab abbb baab bbab bbbb 1输出bbbbb题目分析本题的核心是模拟循环单词的演化并利用状态循环加速。状态表示由于n16n 16n16每个单词可以用一个161616位整数表示000表示a111表示b。总状态数最多216655362^{16} 6553621665536可以存储。演化规则对于每个位置iii需要获取三个位置的字母i−2i-2i−2、iii、i1i1i1模nnn。这三个位组成一个333位二进制数kkk然后根据规则表rules[k]\textit{rules}[k]rules[k]得到新位。所有位置同时更新。循环检测由于状态数有限经过一定步数后必然进入循环。使用数组steps[state]\textit{steps}[state]steps[state]记录每个状态首次出现的步数。模拟过程中若当前状态已出现过则进入循环可直接计算出sss步后的状态。否则继续模拟。输出最终状态表示为二进制字符串生成所有循环移位取字典序最小的输出ab。复杂度分析预处理规则O(1)O(1)O(1)模拟最多655366553665536步之后查询O(1)O(1)O(1)可接受。代码实现// Word// UVa ID: 517// Verdict: Accepted// Submission Date: 2016-12-24// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constintMAXN116;intrules[8],steps[MAXN],indexer[MAXN];intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intn,s;string word,rule;while(cinn){cinword;intw0;for(inti0;iword.length();i){w*2;if(word[i]b)w;}for(inti1;i8;i){cinrule;intr0;for(intj0;jrule.length()-1;j){r*2;if(rule[j]b)r;}rules[r]rule.back()-a;}cins;memset(steps,-1,sizeof(steps));for(inti0;is;i){if(steps[w]0){intt(s-i)%(i-steps[w]);windexer[steps[w]t];break;}else{steps[w]i;indexer[i]w;intww0;for(intj0;jn;j){intk0;if((1(j2)%n)w)k4;if((1j)w)k2;if((1((j-1n)%n))w)k1;ww|(rules[k]j);}www;}}wordbitset16(w).to_string().substr(16-n);setstringwords;string wordwordwordword;for(inti0;iword.length();i)words.insert(wordword.substr(i,word.length()));word*(words.begin());for(inti0;iword.length();i){if(word[i]0)couta;elsecoutb;}cout\n;}return0;}

相关新闻

最新新闻

分立元器件门电路:从二极管到三极管,逻辑门的原始形态

分立元器件门电路:从二极管到三极管,逻辑门的原始形态

分立元器件门电路:从二极管到三极管,逻辑门的原始形态 在 CMOS 芯片统治世界之前,逻辑门是用一个个分立的二极管、三极管和电阻,在电路板上焊出来的。理解这些原始的门电路,才能真正理解"逻辑运算如何变成物理电路"。 现在的芯片里有几十亿个晶体管,一个与非门…

2026/8/25 15:14:46
PCB 3D封装2---HDR2.54排针排母

PCB 3D封装2---HDR2.54排针排母

本文介绍HDR2.54排针排母的PCB 3D封装,主要有单排、双排、排针、排母。同时又分为立式和卧式以及直插和贴片。 1、单排贴片卧式排针 主要有1P-20P共计20种。如下图所示。 2、单排贴片卧式排母 主要有1P-20P共计20种。如下图所示。 3、双排贴片卧式排母 主要有2P…

2026/8/25 15:14:46
【Linux】 进程(5) 僵尸进程与内存泄漏扩展

【Linux】 进程(5) 僵尸进程与内存泄漏扩展

僵尸进程与内存泄漏:一个被反复追问的问题 一、问题的起源这是一个在学习 Linux 进程管理时几乎每个人都会遇到的思考链条:如果我就是不回收子进程呢?↓ 子进程永远处于 Z(僵尸)状态↓ task_struct 不会被释放了吗&am…

2026/8/25 15:14:46
从零开始的敲代码生活--数据结构篇(队列)

从零开始的敲代码生活--数据结构篇(队列)

一、队列基础概念队列:一种允许从一端插入数据,另外一端删除数据的线性存储结构称为队列。 把数据插入的这端称为队列的队尾,数据删除这端称为队列的队头。 插入操作称为入队;删除操作称为出队。特点: 先进先出、后进后…

2026/8/25 15:14:46
ABAP 到底有没有自己的 npm registry,从 SAP Package、abapGit、gCTS 一路看到 apm Registry

ABAP 到底有没有自己的 npm registry,从 SAP Package、abapGit、gCTS 一路看到 apm Registry

2026 年再讨论这个问题,答案已经不能简单停留在「ABAP 没有 npm」这一层。ABAP 生态过去确实长期缺少一个真正对应 npm registry 的东西,但现在已经出现了相当接近 npm 思路的实现。特别是 ABAP Package Manager,也就是 apm,已经建立了自己的 apm Registry,并且公开展示了…

2026/8/25 15:14:46
【系列:uC/OS-II 内核源码精读:从 6736 行代码看懂一个 RTOS · 第 8 篇】

【系列:uC/OS-II 内核源码精读:从 6736 行代码看懂一个 RTOS · 第 8 篇】

裸机时代用全局变量传数据,一上 RTOS 就到处踩坑。uC/OS-II 的邮箱和消息队列,本质都是"传指针不传数据"。本文从源码逐行拆解 OSMbox 与 OSQ:环形缓冲怎么回绕、消息怎么经 OSTCBMsg 交付、为什么"零拷贝"的代价是生命周…

2026/8/25 15:09:45