首页 > 其他分享 >AtCoder Beginner Contest 242(D,E)

AtCoder Beginner Contest 242(D,E)

时间:2023-05-03 18:11:46浏览次数:48  
标签:AtCoder return Beginner 字符 int long 242 include define

AtCoder Beginner Contest 242(D,E)

D(二叉树搜索)

D

题目大意就是首先给你一个字符串,代表\(S^0\),然后我们可以操作得到\(S^1,S^2\)等等

我们可以知道\(S^i\)是拿\(S^(i-1)\)经过一系列替换而来的,因为这个字符串只有三种字符串,\(A,B,C\),这个替换方式就是把\(A\)替换成\(BC\),把\(B\)替换成\(CA\),把\(C\)替换成\(AB\)

题目会有\(q\)次询问,询问的是\(S^t\)的第\(k\)个字符

我们可以发现对于每一次替换,字符串的数量都会乘以二,而且原来在第\(x\)的字符,可能会变成\(2\times x\)的一个字符,和\(2\times x+1\)的一个字符,我们可以发现这个和二叉树左右子树很像,而且,这个替换也是有规律的,替换后的前一个字符和原来的字符相差为\(1\),第二个相差为\(2\),所以我们也可以根据位置一直往前找,知道那个序列是最初的序列,或者是已经出现了位置是\(0\)的情况,那么我们可以直接得出答案

对于如果此时的状态已经是最初的状态,即\(S^0\),我们直接输出\(s[k]\)

对于如果此时的\(k\)已经是\(0\)了,说明每一次它都是最开始的那一个字符,不过每一次字符都在改变,具体会改变多少次,需要根据此时的\(t\)而定,我们可以发现每转换一次,第一个字符都会相加一次(这个相加很像加一,然后对三取余,\(0\)代表\(A\),\(1\)代表\(B\),\(2\)代表\(B\),这个转换很像这样的一个循环),所以我们最后返回的就是\((s[0]-'A'+t)%3\)(记得不要忘记取余哦)

对于不是以上两种状态时,我们需要怎么样转移呢

我们这个就用到以上发现这一个转换过程很像二叉树的遍历过程,对于此时是一个\(k\)的字符,那么它对应的上一个序列\(S^{t-1}\)的位置是在\(\lfloor \frac{k}{2} \rfloor\),然后他的符号和\(S^{t-1}\)这个位置的关系是什么呢,还是根据上面发现的,前面一个是相差为\(1\),后面一个相差为\(2\),因为这个字符串是从\(0\)开始的,所以前面的那一个一定是偶数,故我们可以根据奇偶性来判断这个字符和上一个序列字符的差

所以,我们可以返回\((find(t-1,k/2)+k\pmod2+1)\pmod3\)

具体的可以看代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define mem(a,b) memset((a),(b),sizeof(a))
const double eps=1e-9;
const int maxn=1e6+10;
const int mod=998244353;
int n,q;
string s;
int find(int t,int k)
{
   if(t==0)
   {
      return (s[k]-'A')%3;
   }
   else if(k==0)
   {
      return (s[0]-'A'+t)%3;
   }
   else 
   {
      return (find(t-1,k/2)+k%2+1)%3;
   }
}
void solve()
{
   int t,k;
   cin>>t>>k;
   int p=find(t,k-1);
   char ch='A'+p;
   //cout<<p<<"\n";
   cout<<ch<<"\n";
}
signed main() 
{
   cin>>s>>q;
   while (q--)
   {
      solve();
   }
   system ("pause");
    return 0;
}

E(组合问题)

E

这个题目是多种案列

题目给出一个字符串\(s\)和一个该字符串的长度\(n\)

然后问我们它可以构造出多少个满足一下条件的字符串\(t\)

\(1\),\(t\)是一个回文

\(2\),\(t\)的字典序比\(s\)小

题目告诉这个\(t\)是一个回文,我就觉得我们可以不用考虑后面半段了,因为如果前面一半固定了的话,那么后面一半也固定了,并且已经可以判断出字典序的大小了

所以我就通过改变前面半段

对于此时的一个字符,如果我要想让这个字符改变后才让\(t\)变得比\(s\)小,(那么前面的必须是一样的,这个字符只能变得更小,后面的可以改变的可以任意),那么对于这一个字符,可以得到的贡献为\((ch-'A')\times count^{26}\),其中\(count\)是后面还未固定的字符数量

最后,我们还需要考虑一种情况,那就是在前半段都不改变的情况下得到的回文,可不可以比\(s\)小,如果小,也记得要加上去

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define mem(a,b) memset((a),(b),sizeof(a))
const double eps=1e-9;
const int maxn=1e6+10;
const int mod=998244353;
string s;
int n;
int t;
int ksm(int x,int p)
{
   int res=1;
   while (p)
   {
      if(p&1)
      {
         res=res*x%mod;
      }
      x=x*x%mod;
      p>>=1;
   }
   return res%mod;
}
void solve()
{
   cin>>n>>s; 
   string t=s;
   s=" "+s;
   int ans=0;
   int r=(n+1)/2;
   string left = t.substr(0, (n + 1) / 2), right = left;  // 分为两半
    reverse(right.begin(), right.end());  // right为left的翻转,为最后的特判做铺垫
    if (n & 1)  right.erase(right.begin());  // 奇数长度的特殊处理
   for (int i=1;i<=r;i++)
   {
      int now=s[i]-'A';
      int count=(r-i);
      ans=(ans+now*ksm(26,count)%mod)%mod;
   }
   string p=left+right;
   p=" "+p;
   if(p<=s) ans=(ans+1)%mod;
   cout<<ans<<"\n";
}
signed main() 
{
   cin>>t;
   while (t--)
   {
      solve();
   }
   system ("pause");
    return 0;
}

标签:AtCoder,return,Beginner,字符,int,long,242,include,define
From: https://www.cnblogs.com/righting/p/17369480.html

相关文章

  • AtCoder Regular Contest 125 F Tree Degree Subset Sum
    洛谷传送门AtCoder传送门首先将度数\(-1\)。设\(f_i\)为体积为\(i\)至多能用几个物品凑出来,\(g_i\)为至少。我们现在要证明一个东西:\(x\in[g_i,f_i]\),\((i,x)\)合法。首先若\((s,x)\)合法,那么必须满足\(s-x\in[-z,z-2]\),其中\(z=\sum\limits_{i=1}......
  • AT_abc106_d [ABC106D] AtCoder Express 2 题解
    题目传送门解题思路区间\(dp\)。划分阶段:以左右城市之间的列车数量为阶段。状态表达:设\(f_{i,j}\)为城市\(i\)与城市\(j\)之间的列车数量。状态转移:由图可知,城市\(l\)与城市\(r\)之间的列车数量,就是城市\(l\)与城市\(r-1\)之间的列车数量与城市\(l+1\)与......
  • AtCoder Regular Contest 119 F AtCoder Express 3
    洛谷传送门AtCoder传送门很厉害的题!考虑所有车站已确定,如何求\(0\)到\(n+1\)的最短路。设\(g_{i,0}\)为只考虑\(0\simi\)的点,到\(i\)和它左边第一个\(\text{A}\)的最短路,\(g_{i,1}\)同理。有转移:若\(s_{i-1}=\text{A},s_i=\text{A},g_{i,0}\getsg_{......
  • AtCoder Regular Contest 119 D Grid Repainting 3
    洛谷传送门AtCoder传送门对每个红格的行和列连边,建出二分图。对于二分图中的每个连通块分别考虑。大胆猜测对于每个连通块,我们都能够进行适当的操作,使得只有一行/一列没被操作(显然不能使所有行和列都被操作)。对应的方案就是随便取一棵生成树,把不被染白的那一行/列拎出来当根,然......
  • AtCoder Regular Contest 117 F Gateau
    洛谷传送门AtCoder传送门差分约束算法:给出\(m\)个不等式形如\(x_{a_i}\lex_{b_i}+y_i\),求是否有解。考虑把不等式看成图上的三角不等式\(dis_v\ledis_u+d\),连边\((b_i,a_i,y_i)\),以\(x_i\)最大的位置跑最短路,如果图中有负环就无解。此时求出来的\(dis_i\)......
  • Atcoder Grand Contest 059 E - Grid 3-coloring(转化+思维)
    首先先是一步很猛的操作——将三染色视作构造一个矩阵使得相邻元素相差\(1\)且每个元素\(\bmod3\)的值就等于其颜色。证明是显然的,我们按从上到下从左到右的顺序填数,可以归纳证明,对于一个相邻格子颜色互不相同的矩阵的填数方案,处于斜对角的两个格子上写的数要么差\(2\),要么......
  • AtCoder Regular Contest 122 D XOR Game
    洛谷传送门AtCoder传送门从高到低按位考虑。设当前位有\(k\)个\(1\)。如果\(k\bmod2=0\),这意味着Alice如果选了一个数,Bob可以选相同的数。发现可以分成\((0,0),(1,1)\)两组,递归下去即可。如果\(k\bmod2=1\),意味着答案这一位一定是\(1\)(因为无论如何都不......
  • AtCoder Regular Contest 119 E Pancakes
    洛谷传送门AtCoder传送门感觉挺典的,为啥有2500啊(观察发现,反转序列对\(\sum\limits_{i=1}^{n-1}|a'_i-a'_{i+1}|\)影响不大。具体而言,设反转了\(a_l\sima_r\),记\(s=\sum\limits_{i=1}^{n-1}|a_i-a_{i+1}|\),那么\(s'=s-|a_{l-1}-a_l|-|a_r-a_{r+1}|......
  • AtCoder Regular Contest 117 D Miracle Tree
    洛谷传送门AtCoder传送门第一步就没想到可以考虑化简限制。设所有点按\(E_i\)从小到大排序后顺序是\(p_1,p_2,...,p_n\)。发现只需满足\(E_{p_{i+1}}-E_{p_i}\ge\operatorname{dis}(p_i,p_{i+1})\)。证明是对于任意\(i<j<k\),若\(p_i,p_j\)和\(p_j,p_k\)均满......
  • AtCoder Beginner Contest 231
    A-WaterPressure#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn; cin>>n; printf("%.6lf\n",n/100.0);return0;}B-Election#include<bits/stdc++.h>usingnamespacestd;intmain(){ ios:......