又到了周末刷cf 的时候了!这套题好水的样子,然而用并查集写的D调了一晚上都有问题,有点崩溃,过两天再重新写。
A就是两串的长度的较大值,或者两个串相等时-1
B题排序后三位一比较,如果有a[n]+a[n+1]>a[n+2]就可以。
C题看着有点吓人,其实第一第二问是可以一起算出来的。dp[i]表示前i个字母有几种,dp[i+1]=dp[i]+dp[i-1]+…+dp[i-k],k是满足从字符串第i-k+1位到第i位的字母的约束值都大于等于k的最大整数。然后第一问就是dp[N],第二问就是最大的k。第三问贪心跑一遍就行。数组开小了WA了一次。
下面是代码
#include<iostream>
#include<string>
using namespace std;
int main(){
string a,b;
cin>>a>>b;
if(a==b)cout<<-1;
else if(a.length()>b.length())cout<<a.length();
else cout<<b.length();
return 0;
}
#include<stdio.h>
#include<algorithm>
int a[100020];
int main(){
int T;
scanf("%d",&T);
if(T>=45){
printf("YES");
return 0;
}
for(int i=0;i<T;i++){
scanf("%d",a+i);
}
std::sort(a,a+T);
for(int i=0;i<=T-3;i++){
if(a[i]+a[i+1]>a[i+2]){
printf("YES");
return 0;
}
}
printf("NO");
return 0;
}
#include<stdio.h>
#define min(x,y) (x)<(y)?(x):(y)
const int mod=1e9+7;
char str[1001];
int t[227], dp[1001];
int main(){
int T,ans2=-1,ans3=0,k=0;
scanf("%d%s",&T,str);
for(int i=0;i<26;i++)
scanf("%d",t+i+'a');
dp[0]=1;
for(int i=1;i<=T;i++){
int m=t[str[i-1]],j=2;
dp[i]=dp[i-1];
for(;j<=i+1;j++){
m=min(m,t[str[i-j]]);
if(m<j)
break;
dp[i]+=dp[i-j];
while(dp[i]>mod)dp[i]-=mod;
}
if(ans2<j)ans2=j;
if(i-j+1>k){
ans3++;
k=i-1;
}
}
printf("%d\n%d\n%d",dp[T],ans2-1,ans3+1);
return 0;
}