LeetCode 2427. 公因子的数目
枚举即可
class Solution {
public:
int commonFactors(int a, int b) {
int res=0;
for(int i=1;i<=min(a,b);i++)
{
if(a%i==0&&b%i==0)res++;
}
return res;
}
};
LeetCode 2428. 沙漏的最大总和
枚举
class Solution {
public:
int maxSum(vector<vector<int>>& g) {
int n=g.size(),m=g[0].size();
int res=0;
for(int i=0;i+2<n;i+=1)
{
for(int j=0;j+2<m;j+=1)
{
int sum=0;
sum+=g[i][j]+g[i][j+1]+g[i][j+2]+g[i+1][j+1]+g[i+2][j]+g[i+2][j+1]+g[i+2][j+2];
res=max(res,sum);
}
}
return res;
}
};
LeetCode 2429. 最小 XOR
先求出num2的置位数,由于要求最小的(x^num1),所以x的高位1尽量与num1的高位1一致,如果还有剩余的1,则从右往左将x的0变成1
class Solution {
public:
int get(int x)
{
int res=0;
while(x)
{
if(x&1)res++;
x>>=1;
}
return res;
}
int minimizeXor(int num1, int num2) {
int n=get(num2);
int m=get(num1);
if(n==m)return num1;
int x=num2;
int cnt=0;
while(x)x/=2,cnt++;
vector<int>v,res;
while(num1)v.push_back(num1%2),num1/=2;
int sz=v.size();
for(int i=sz;i<cnt;i++)v.push_back(0);
reverse(v.begin(),v.end());
for(auto &x:v)
if(x==1&&n)res.push_back(1),n--;
else res.push_back(0);
if(n)
{
reverse(res.begin(),res.end());
for(auto &x:res)
if(x==0&&n)n--,x=1;
reverse(res.begin(),res.end());
}
for(auto x:res)n=n*2+x;
return n;
}
};
LeetCode 2430. 对字母串可执行的最大删除数
字符串哈希+记忆化搜索
typedef unsigned long long ull;
const int base=131;
class Solution {
public:
vector<ull>h,p;
ull get(string &s,int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];
}
int dfs(int l,string &s,vector<int>&dp)
{
if(l==s.size())return 0;
if(dp[l]!=-1)return dp[l];
int cnt=1;
for(int i=l;i<s.size();i++)
{
int r=i,len=r-l+1;
if(get(s,l,r)==get(s,r+1,r+len))
cnt=max(cnt,dfs(r+1,s,dp)+1);
}
dp[l]=cnt;
return cnt;
}
int deleteString(string s) {
int n=s.size();
h.resize(50010),p.resize(50010);
vector<int>dp(50010,-1);
s=" "+s;
p[0]=1;
for(int i=1;i<=n;i++)
{
h[i]=h[i-1]*base+s[i];
p[i]=p[i-1]*base;
}
return dfs(1,s,dp);
}
};
字符串哈希+dp
dp[i]
表示从i
开始删除字符串所需要的最大步数
初始化dp[n]=1
状态转移:dp[i]=max(dp[i],dp[i+j]+1);(lcp)
typedef unsigned long long ull;
const int base=131;
class Solution {
public:
vector<ull>h,p;
ull get(string &s,int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];
}
int deleteString(string s) {
int n=s.size();
h.resize(n+2),p.resize(n+2);
vector<int>dp(n+2,-1);
s=" "+s;
p[0]=1;
for(int i=1;i<=n;i++)
{
h[i]=h[i-1]*base+s[i];
p[i]=p[i-1]*base;
}
for(int i=n;i;i--)
{
dp[i]=1;
for(int j=1;j<=(n-i+1)/2;j++)
{
if(get(s,i,i+j-1)==get(s,i+j,i+j*2-1))dp[i]=max(dp[i],dp[i+j]+1);
}
}
return dp[1];
}
};