字典序

UVA-1599 Ideal Path(双向BFS)

半世苍凉 提交于 2019-11-28 03:04:20
题目: 给一个n个点m条边(2≤m≤100000, 1≤m≤200000)的无向图,每条边上都涂有一种颜色(用1到1000000000表示)。求从结点1到结点n的一条路径, 使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小。一对结点间可能有多条边,一条边可能连接两个相同结点。输入保证结点1可以 到达结点n。 思路: 看到边数尽量少,颜色序列字典序最小,知道这是用BFS来做这个题。但是一直卡在怎么处理颜色的字典序最小上。看了答案之后知道先逆向处理每个节点到终点 的距离d[ i ],然后在正向分层BFS找出颜色最小的一条路径。 1.逆向处理距离d[]数组。 2.正向分层BFS根据当前结点的d[i]与下一个结点的d[i+1]之间差1来得出颜色字典序最小的一条路径。 这里我一开始使用队列来写的,但是这种写法在一层中找最小的颜色的时候是只找了一个结点,这就导致了得出的答案中的颜色不一定是同一条路径上的。 例如下面这个例子: 6 6 1 2 1 1 3 1 2 4 3 3 5 2 4 6 4 5 6 5 正确的答案应该是1,2,5,而我写出的答案却是1,2,4,苦思无果到网上看了下大佬的博客自己才写出来。 既然是分层BFS那么这种情况我们可以用循环遍历每一层,在每一层中用一个vector数组来存一下这一层中的所有的节点, 在这些节点中查找最小的颜色

2019暑假集训 文件压缩

你离开我真会死。 提交于 2019-11-27 20:53:24
题目背景 提高文件的压缩率一直是人们追求的目标。近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本身并不压缩文件,但是经这种算法调整后的文件在大多数情况下都能获得比原来更大的压缩率。 题目描述 该算法具体如下:对一个长度为 n n的字符串 S S,首先根据它构造 n n个字符串,其中第 i i个字符串由将 S S的前 i-1 i − 1个字符置于末尾得到。然后把这 n n个字符串按照首字符从小到大排序,如果两个字符串的首字符相等,则按照它们在 S S中的位置从小到大排序。排序后的字符串的尾字符可以组成一个新的字符串 S S’,它的长度也是 n n,并且包含了 S S中的每一个字符。最后输出 S S’以及 S S的首字符在 S S’中的位置 p p。举例: S:example 1、构造 n n个字符串 example xamplee ampleex mpleexa pleexam leexamp eexampl 2、将字符串排序 ampleex example eexampl leexamp mpleexa pleexam xamplee 3、压缩结果 xelpame x e l p a m e S S’ 7 7 p p 由于英语单词构造的特殊性,某些字母对出现的频率很高,因此在 S S’中相同的字母有很大几率排在一起,从而提高 S S’的压缩率

字典序全排序【permutation】+火车进出站

喜欢而已 提交于 2019-11-27 18:37:01
【描述】 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。 【输入】 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。 【输出】 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。 样例输入 3 1 2 3 样例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 【解题思路】 首先:构造出所有可能的输出序列, 然后:用字典序输出 初始化一个sort vector<string>: 每种输出结果用string形式存入vector中,然后对vector进行sort,按照字典序排序。 #include <stack> #include <iostream> #include <stack> #include <algorithm> #include <vector> using namespace std; bool isOutNum(int *push, int *pop, int len)//判断pop是不是push的出栈序列 { if (push == NULL || pop == NULL || len <= 0) return false; stack<int> Stack;

P1385 密令

删除回忆录丶 提交于 2019-11-27 05:44:42
题目描述 给定一小写字母串s,每次操作你可以选择一个p(1<=p<|s|)执行下述修改中的任意一个: 将s[p]改为其字典序+1的字母,将s[p+1]改为其字典序-1的字母 或 2. 将s[p]改为其字典序-1的字母,将s[p+1]改为其字典序+1的字母 在经过任意多次操作后,串s能变化成多少种字符串? 修改过程中必须保证s是合法的小写字母串(即不能对字母‘a’进行字典 序-1的操作),答案对1000000007(10^9 + 7)取模。 输入格式 【输入格式】 第一行一个整数T,表示数据组数 接下来T行,每行一个小写字母串s。 输出格式 【输出格式】 输出T行,每行一个整数表示答案。 输入输出样例 输入 #1 复制 【样例输入】 3 aaaaaaaaa ya klmbfxzb 输出 #1 复制 【样例输出】 0 24 320092793 说明/提示 【数据范围】 对于30%的数据,T=1;|s|<=10 对于60%的数据,T<=10; 对于100%的数据,T<=10000;1<=|s|<=100 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; long long t,num

P1385 密令

不羁岁月 提交于 2019-11-27 05:44:32
题目描述 给定一小写字母串s,每次操作你可以选择一个p(1<=p<|s|)执行下述修改中的任意一个: 将s[p]改为其字典序+1的字母,将s[p+1]改为其字典序-1的字母 或 2. 将s[p]改为其字典序-1的字母,将s[p+1]改为其字典序+1的字母 在经过任意多次操作后,串s能变化成多少种字符串? 修改过程中必须保证s是合法的小写字母串(即不能对字母‘a’进行字典 序-1的操作),答案对1000000007(10^9 + 7)取模。 输入格式 【输入格式】 第一行一个整数T,表示数据组数 接下来T行,每行一个小写字母串s。 输出格式 【输出格式】 输出T行,每行一个整数表示答案。 输入输出样例 输入 #1 复制 【样例输入】 3 aaaaaaaaa ya klmbfxzb 输出 #1 复制 【样例输出】 0 24 320092793 说明/提示 【数据范围】 对于30%的数据,T=1;|s|<=10 对于60%的数据,T<=10; 对于100%的数据,T<=10000;1<=|s|<=100 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; long long t,num

8.11 hdu 多校第五场补题

◇◆丶佛笑我妖孽 提交于 2019-11-27 00:28:41
6629 string matching 题意:给定一个字符串s,求s与自身所有前缀暴力匹配所需匹配次数 分析:每个前缀匹配次数即自身长度,exkmp的next数组记录的就是与自身最大匹配前缀的长度,加一遍就行,注意边界 代码: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> #define fi first #define se second #define rep( i ,x ,y ) for( int i= x; i<= y ;i++ ) #define reb( i ,y ,x ) for( int i= y; i>= x ;i-- ) #define mem( a ,x ) memset( a ,x ,sizeof(a)) using namespace std; typedef long long ll; typedef pair<int ,int> pii; typedef pair<ll ,ll> pll; typedef pair<string ,int> psi; char s[1005000]; int nxt[1005000]; void getnext( int l){ int a=0 ,p

背包问题的转化

廉价感情. 提交于 2019-11-26 23:52:28
转载自:https://www.lmlphp.com/user/56/article/item/4098/ 以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。 例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间。这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到。 还有,如果要求的是“总价值最小”“总件数最小”,只需简单的将上面的状态转移方程中的max改成min即可。 下面说一些变化更大的问法。 输出方案 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪一个策略推出来的。便可根据这条策略找到上一个状态,从上一个状态接着向前推即可。 还是以01背包为例,方程为 f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 再用一个数组g[i][v],设g[i][v]=0表示推出f[i][v]的值时是采用了方程的前一项(也即f[i][v]=f[i-1][v]),g[i][v]表示采用了方程的后一项。注意这两项分别表示了两种策略

Sequence POJ - 3581 后缀数组

半城伤御伤魂 提交于 2019-11-26 18:22:29
题意: 将一个序列分成非空的三部分,将每部分翻转后组合成一个新的序列, 输出这样操作得到的序列中字典序最小的序列 (保证第一个数是数组中最大的元素) 题解: 把数组当作串串。 因为第一个数最大,所以我们可以先将串反过来,然后可以找第一个sa[ i ] > 1 , 因为sa[ i ] 就是字典序从小到大排列的。 然后第二部分的处理就我是看题解的。 第二部分不能直接这样求解 例如: 除去第一部分之后的序列为 4 3 2 2 ,如果直接选取字典序最小的的串是 2 ,那么最后的解是 2 4 3 2 显然是错的 但是我们将串翻倍后变为4 3 2 2 4 3 2 2 前4个数中字典序最小的就为2 2 4 3 2 2 ,然后出去翻倍的部分 4 3 2 2 这样的求解就是最优的了 剩下的直接补充即可。 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include <set> 7 #include <iostream> 8 #include <map> 9 #include <stack> 10 #include <string> 11 #include <time.h> 12 #include <vector> 13 #define

洛谷P1385 密令 题解 动态规划

僤鯓⒐⒋嵵緔 提交于 2019-11-25 19:34:50
题目链接: https://www.luogu.com.cn/problem/P1385 题目大意: 给定一小写字母串s,每次操作你可以选择一个p(1<=p<|s|)执行下述修改中的任意一个: 将s[p]改为其字典序+1的字母,将s[p+1]改为其字典序-1的字母 或 将s[p]改为其字典序-1的字母,将s[p+1]改为其字典序+1的字母 在经过任意多次操作后,串s能变化成多少种字符串? 修改过程中必须保证s是合法的小写字母串(即不能对字母‘a’进行字典序-1的操作),答案对1000000007(10^9 + 7)取模。 解题思路: 这里说的 字典序(其实就是ASCII码), 对于一个字符串,可以执行的上述 2 种操作都不会更改字符串中所有字符的 ASCII 码总和,所以我们可以定义状态 \(f[i][j]\) 表示前 \(i\) 个字符中的 ASCII码总和为 \(j\) 的情况下的方案数,则可以得到状态转移方程为: 对于所有的 \(i == 1\) (假设字符串坐标从 1 开始), \(f[1][j] = 1\) ( \(0 \le j \lt 26\) ); 对于所有 \(i \lt 1\) , \(f[i][j] = \sum_{k=0}^{\min(25,j)} f[i-1][j-k]\) 那么给我们一个字符串 s ,我们只需要知道其长度 n 以及 ASCII码之和