交通建设网站,在网站接入银联怎么做,企业网站建设有哪些好处,软件商店appA - ABC Identity
如果只有AAA,BBB两种字符的话#xff0c;我们发现要寻找p∈[1,n]p\in [1,n]p∈[1,n]#xff0c;使得[1:p][1:p][1:p]中AAA的数目与[p1:n][p1:n][p1:n]中BBB的数目相同。
如果有A,B,CA,B,CA,B,C三种字符#xff0c;我们可以先将A,BA,BA,B分离出来#xf…A - ABC Identity
如果只有AAA,BBB两种字符的话我们发现要寻找p∈[1,n]p\in [1,n]p∈[1,n]使得[1:p][1:p][1:p]中AAA的数目与[p1:n][p1:n][p1:n]中BBB的数目相同。
如果有A,B,CA,B,CA,B,C三种字符我们可以先将A,BA,BA,B分离出来再将B,CB,CB,C分离出来最后把A,CA,CA,C分离出来这样最后会生成888个子序列 然后无法通过
神谕告诉我们A,B,CA,B,CA,B,C三种字符一共只有666种本质不同的排列因此我们可以考虑把原序列分成长度为nnn的333段从每一段中分别选取一个字符构成A,B,CA,B,CA,B,C的排列最后把相同的排列放在一起即可。猜一下结论这显然是有解的。
这种题还是要多尝试
#includebits/stdc.h
#define pb push_back
using namespace std;
vectorintv[3][3];
string s;
int n,res[600005];
int has(int x,int y,int z){return x*2(y-(xy))*1;
}
int main(){cinns;for(int i0;i3*n;i){v[i/n][s[i]-A].pb(i);}for(int i1;in;i){for(int j0;j3;j){for(int k0;k3;k){for(int l0;l3;l){if(v[0][j].size()v[1][k].size()v[2][l].size()j!kk!lj!l){res[v[0][j].back()]has(j,k,l);res[v[1][k].back()]has(j,k,l);res[v[2][l].back()]has(j,k,l);v[0][j].pop_back();v[1][k].pop_back();v[2][l].pop_back();}}}}}for(int i0;i3*n;i)coutres[i]1;
}B - ABC Supremacy
如果只考虑SSS怎么生成TTT的话怎么做都是O(n2)O(n^2)O(n2)的。数据删除
上面那种思路可能不太好处理 但是操作是可逆的因此判断S,TS,TS,T同构的一个充分条件是它们都能到达一个相同的状态PPP。所以我们只要求出S,TS,TS,T的最小表示即可这样一个字符串生成的表示是唯一的就不用担心上述问题了。
剩下的就是怎么去寻找最小串。比较烦恼就先咕了
显然我们要凑出尽量多的ABCABCABC串这里指轮换并且每次操作相当于将ABCABCABC串这个整体挪到前面然后把AAA放在最前面。那么BCBCBC是固定的吗如果BCBCBC不是固定的这个问题也比较烦恼可以先咕着
开始慌张 不过幸运的是之前的结论还是正确的
我们可以把最小表示的定义换成 得到最多的ABCABCABC轮换组那么BCBCBC就肯定是固定的了。
复杂度O(n)O(n)O(n)。
#includebits/stdc.h
#define pb push_back
using namespace std;
int n;
string s,t;
vectorcharsolve(string s){vectorcharv;for(int i0;is.size();i){v.pb(s[i]);if(v.size()3(v[v.size()-3]Av[v.size()-2]Bv[v.size()-1]C||v[v.size()-3]Bv[v.size()-2]Cv[v.size()-1]A||v[v.size()-3]Cv[v.size()-2]Av[v.size()-1]B)){v.pop_back();v.pop_back();v.pop_back();}}return v;
}
int main(){cinnst;cout(solve(s)solve(t)?YES:NO);
}C - Weird LIS
如果我们能思考清楚{Ai}\{A_i\}{Ai}合法的充要条件那么这道题也就解决了。
或者说能建立双射然后计数也行
想不太清楚所以先咕了
思路其实并不困难不过可能需要猜几个结论。
1.11.11.1 如果AiA_iAi全部等于KKK猜测K≤⌊n2⌋K\le \lfloor\frac{n}{2}\rfloorK≤⌊2n⌋这还是比较容易看出来。 1.21.21.2 如果KKK和K−1K-1K−1同时存在那么AiK−1A_iK-1AiK−1的那些点是固定的我们要在所有AiKA_iKAiK的连续段中挑选一段接在固定的数之间那么根据1.11.11.1的推论这一段的长度不能超过⌊l2⌋\lfloor\frac{l}{2}\rfloor⌊2l⌋lll表示连续段长度我们猜测对于更小的情况也是取得到的因此∑⌊li2⌋cntK−1≥K\sum{\lfloor\frac{l_i}{2}\rfloor}cnt_{K-1}\ge K∑⌊2li⌋cntK−1≥K并且cntK−1≤Kcnt_{K-1}\le KcntK−1≤K。
这个向下取整好像不太妙先咕了
计数这个地方可能要多尝试
复杂度O(n2)O(n^2)O(n2)。不过要注意特判Ain−1A_in-1Ain−1的情况。
#includebits/stdc.h
#define ll long long
#define pb push_back
using namespace std;
const int N5005;
int n,m,mod;
ll fac[N],inv[N],res;
ll pw(ll x,ll ymod-2){ll z(1);for(;y;y1){if(y1)zz*x%mod;xx*x%mod;}return z;
}
void init(int n){fac[0]1;for(int i1;in;i)fac[i]fac[i-1]*i%mod;inv[n]pw(fac[n]);for(int in;i1;i--)inv[i-1]inv[i]*i%mod;
}
ll binom(int x,int y){if(x0||y0||xy)return 0;return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int main(){cinnmmod,init(n1);for(int x1;xn;x){for(int y0;y(n-x)/2;y){int Lmax(3,x),Rmin(m,xy);if(LR)res(resbinom(xy,x)*binom(x1,n-x-2*y)%mod*(R-L1))%mod;}}for(int i2;imin(m,n/2);i)res;if(mn-1)res;coutres%mod;
}D - ABC Ultimatum
先考虑怎么判断给定串合法。
好像没什么思路先咕了
不过这题还是有学习的价值的我们可以照着结论来翻译一下
设Sa(i),Sb(i),Sc(i)S_a(i),S_b(i),S_c(i)Sa(i),Sb(i),Sc(i)表示1∼i1\sim i1∼i中a,b,ca,b,ca,b,c的个数Mamax(Sb(i)−Sa(i)),Mbmax(Sc(i)−Sb(i)),Mcmax(Sa(i)−Sc(i))M_a\max (S_b(i)-S_a(i)),M_b\max(S_c(i)-S_b(i)),M_c\max(S_a(i)-S_c(i))Mamax(Sb(i)−Sa(i)),Mbmax(Sc(i)−Sb(i)),Mcmax(Sa(i)−Sc(i))则SSS是好的当且仅当MaMbMc≤nM_aM_bM_c\le nMaMbMc≤n
必要性应该很显然可以猜一个结论或者打表证明这是充要的。
可能有时间会补一下证明
然后暴力复杂度O(n7)O(n^7)O(n7)。但是很显然可以省去一维状态因此就可以在O(n6)O(n^6)O(n6)时间内通过了。
#includebits/stdc.h
#define ll long long
#define pb push_back
using namespace std;
const int mod998244353;
int n,dp[17][17][17][17][17][17],res;
string s;
void add(int x,int y){if((xy)mod)x-mod;
}
int main(){cinns;dp[0][0][0][0][0][0]1;for(int i0;i3*n;i){for(int a0;an;a){for(int b0;bn;b){int ci-a-b;if(cn||c0)continue;for(int j0;jn;j){for(int k0;kn;k){for(int l0;ln;l){int tmpdp[a][b][c][j][k][l];if(s[i]A||s[i]?){add(dp[a1][b][c][j][k][max(l,a1-c)],tmp);}if(s[i]B||s[i]?){add(dp[a][b1][c][max(b1-a,j)][k][l],tmp);}if(s[i]C||s[i]?){add(dp[a][b][c1][j][max(c1-b,k)][l],tmp);}}}}}}}for(int i0;in;i){for(int j0;jn;j){for(int k0;kn;k){if(ijkn)add(res,dp[n][n][n][i][j][k]);}}}coutres;
}E - Set Merging
场上无一人AC
这种给你规定输入的构造题就很烦那么我们就要去分析一些性质看它在不同情况下是否成立。
某个人曾经说过第一个做出这种题的人一定是具有非凡的人类智慧的