题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,000 题解: 首先我们可以把所有的串插入到Trie树中. 然后我们枚举每个串,判断是否存在可行方案 我们枚举到一个串,那么我们就在Trie树中进行查找 每一次从某一个节点向下走的时候,我们都要保证当前走的这条支路是字典序最小的 也就是这条支路上的字母的字典序小于这个节点上的其他所有支路的字典序 所以我们就成功…
Code: #include<bits/stdc++.h> #define maxn 1000003 using namespace std; char str[maxn],strtot[maxn]; int lentot,scc,flag,pp=0; int st[maxn],ed[maxn],C[30][30],vis[maxn],vised[maxn],pre[maxn],low[maxn]; void setIO(string s) { string in=s+".in&qu…
[BZOJ3012][Usaco2012 Dec]First! Description Bessie has been playing with strings again. She found that by changing the order of the alphabet she could make some strings come before all the others lexicographically (dictionary ordering). For instance…
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabet she could make some strings come before all the others lexicographically (dictionary ordering). For instance Bessie found that for the strings "omm&…
子树操作, dfs序即可.然后计算<=L就直接在可持久化线段树上查询 ------------------------------------------------------------------- #include<bits/stdc++.h>   using namespace std;   #define M(l, r) (((l) + (r)) >> 1)   const int maxn = 200009;   typedef long long ll;  …
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N=3e4+5; typedef long lo…
题目 E[中]假的字符串 做法 一个字符串能作为最小值最基础的条件为不能出现前缀字符串 我们需要确定一种每个字符的排名使得\(s\)作为最小值,另有很多字符串\(t\),与\(s\)第一个不相同的位置可以产生一种偏序限制,如\(s-x,t_y,rk_x<rk_y\) 而判断是否可行直接跑拓扑排序就行 code #include<bits/stdc++.h> typedef int LL; const LL maxn=300009; typedef std::string str; str…
也就是给定有向图,求最小字典序的拓扑序,直接用小根堆就行(或者反着建图用大根堆) #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100005; int T,n,m,d[N],h[N],cnt,ans[N]; priority_queue<int>q; struct qwe { int ne…
dfs会T,只好正反两遍拓扑了-- #include<iostream> #include<cstdio> #include<queue> #include<vector> using namespace std; const int N=100005; int n,m,h[N],cnt,d1[N],d2[N]; double f[N],p[N],s[N],ans; struct qwe { int ne,no,to; double va; }e[N]; v…
非常迷的一道题啊 我觉得挺对的版本只得了30 总之就是Floyd·改,开两个数组,一个是d[i][j]就是普通的只有边权的最短路,a[i][j]是题目要求的那种 具体改的地方是把枚举中转点的地方把中转点按从小到大的顺序枚举,d[i][j]按照套路更新即可,然后a[i][j]从a[i][j]原数和d[i][j]+max(c[i],c[j],c[中转点])中取min 证明的话是最短路不一定是最终答案,能更新这个答案的一定是最大点更小一些的另一条路,所以按点权顺序更新能保证把这种情况全部更新 #inc…