A
遍历字符串的每个位置,判断此位置,后两个位置的三个字符是否构成red串,统计个数
#include<bits/stdc++.h>
using namespace std;
#define int  long long 
#define maxx 20000
#define mod 2000000
#define INF 0x3f3f3f3f
int ans;
string s;

signed main()
{
  cin>>s;
  for(int i=0;i<s.size()-2;++i)
   if(s[i]=='r'&&s[i+1]=='e'&&s[i+2]=='d')
   ++ans;
  if(ans>=2) cout<<"Yes\n";
  else cout<<"No\n"; 
 

}


B
递推
很明显偶字串的最大长度仅仅受到本位置,前一个位置这两个单个字符的影响,故而两个单个字符外的位置可以直接转移,定义dp[i]为以i为开头的最长偶子串长度,如果i和i+1处的字符串一致,那么可以构成最长为dp[i+2]+1的偶子串,否则不可以。
#include<bits/stdc++.h>
using namespace std;
#define int  long long 
#define maxx 300000
#define mod 2000000
#define INF 0x3f3f3f3f
int ans,n;
int dp[maxx];
string s;


signed main()
{
  cin>>s;
  n=s.size();
  s="0"+s;
  for(int i=n-1;i>=1;--i)
  if(s[i]==s[i+1]) dp[i]=dp[i+2]+1;  
  for(int i=1;i<=n;++i)
  ans=max(ans,dp[i]);
  cout<<ans*2;


 

}


C
构造方法多,以下提供一个
如果可以构造出一个符合题意的数组,那么此数组可以进行排序后变为递增的数组,此数组也符合题意,因为题目未对数组相对位置的相对大小做出要求。
故构造一个符合条件的递增数组。
首先不考虑k,构造一个1-n的排列,此排列的和是所有符合条件2中最小的,此排列的最大值也是符合条件2中最小的,如果此时这两个条件有一个大于条件1与3,那么不可能构造出。
其次从大到小依此分配x-(n+1)*n/2,贪心的将尽可能多的值分配给每一个值,即分配的值要小于前一个并且小于等于x。
分配完毕后若x大于0,说明不可能构造出,因为同时符合条件2与1的最大和x为n-k+1-k的排列,此可以被上述方法构造出,x大于此最大和,自然不合法。
#include<bits/stdc++.h>
using namespace std;
#define int  long long 
#define maxx 200000
#define mod 2000000
#define INF 0x3f3f3f3f
int n,k,x;
int all[maxx];
string s;


signed main()
{
  cin>>n>>k>>x;
  for(int i=1;i<=n;++i)
  all[i]=i;
  if(x<(n+1)*n/2||k<n) 
  {cout<<"-1";
   return 0;
  }
  x=x-(n+1)*n/2;
  all[n+1]=k+1;
  for(int i=n;i>=1;--i)
  {
    int zeng=min(x,(all[i+1]-all[i]-1));
    all[i]=all[i]+zeng;
    x=x-zeng;
  }
  if(x!=0) cout<<"-1";
  else 
  {for(int i=1;i<=n;++i)
  cout<<all[i]<<" ";
  }

}



D
删去尽可能多的权值让图连通,即保留尽可能少的边让图连通,故而至少保留尽可能少的边,生成树有连通图中最小的边,最小生成树为边权值最小的,故而此题被转化为构造最小生成树。
另外在计算末尾0的个数的时候,是连续的0,可以取模来判断,并且有可能溢出。
#include<bits/stdc++.h>
using namespace std;
#define maxx 300000
#define int long long
struct Edge
{
	int u,v,w;
}E[maxx];
int fa[maxx];
int n,m,ans,eu,ev,cnt;
int val[maxx];
int neww,a,b,c;
int ans1=0;
 bool cmp(Edge a,Edge b)
{
    return a.w<b.w;
}
 int find(int x)
{
    while(x!=fa[x]) x=fa[x]=fa[fa[x]];
    return x;
}
 void kruskal()
{
    sort(E+1,E+neww+1,cmp);
    for(int i=1;i<=neww;i++)
    {
        eu=find(E[i].u), ev=find(E[i].v);
        if(eu==ev)//处于一个连通图
        continue;
        fa[ev]=eu;
        ans=ans+E[i].w;
    }
}

int pd(int a,int b)
{
   __int128 w=1;
   __int128 d=(__int128)a*(__int128)b;
  for(int q=1;q<=30;++q)
   {w=w*10;
   if(d%w!=0)
   return q-1;
   }
   return 0;
}
void add(int u,int v,int w)
{
  E[++neww].u=u;
  E[neww].v=v;
  E[neww].w=w;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) fa[i]=i; 
    for(int i=1;i<=n;++i) cin>>val[i];
    for(int i=0;i<m;i++)
    {
        cin>>a>>b;
        c=pd(val[a],val[b]);
        add(a,b,c);
        add(b,a,c);
        ans1=ans1+c;
    }
    kruskal();
    cout<<ans1-ans;
    return 0;
}