1.统计星号
考点:简单模拟
class Solution {
public:
int countAsterisks(string s) {
int cl=0,ca=0,cb=0;
for(auto c:s)
{
if(c=='|'){
cl++;
cl%=2;
}
if(c=='*')ca++;
if(cl==1&&c=='*')cb++;
}
return ca-cb;
}
};
2.统计无向图中无法互相到达点对数
考点:并查集求连通块(维护连通块点的数目)+计数问题
class Solution {
public:
int f[100010];
int cnt[100010];
int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
long long countPairs(int n, vector<vector<int>>& edges) {
for(int i=0;i<n;i++)f[i]=i,cnt[i]=1;
for(int i=0;i<edges.size();i++){
int a=edges[i][0],b=edges[i][1];
int fa=find(a),fb=find(b);
if(fa!=fb)
{
f[fa]=fb;
cnt[fb]+=cnt[fa];
}
}
vector<int>ans;
long long sum=0;
for(int i=0;i<n;i++)
{
if(f[i]==i)
{
ans.push_back(cnt[i]);
sum+=cnt[i];
}
}
long long res=0;
long long sz=0;
for(int i=0;i<ans.size();i++)
{
res+=ans[i]*(sum-ans[i]-sz);
sz+=ans[i];
}
return res;
}
};
3.操作后的最大异或和
考点:思维
class Solution {
public:
int maximumXOR(vector<int>& nums) {
int res=0;
for(auto c:nums)res|=c;
return res;
}
};
4.不同骰子序列的数目
考点:序列类dp
class Solution {
public:
const int mod=1e9+7;
int dp[10010][7][7];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int distinctSequences(int n) {
if(n==1)return 6;
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(gcd(i,j)==1&&i!=j)dp[2][i][j]=1;
}
}
for(int i=3;i<=n;i++)
{
for(int j=1;j<=6;j++)
{
for(int k=1;k<=6;k++)
{
for(int z=1;z<=6;z++)
{
if(gcd(j,k)==1&&gcd(k,z)==1&&j!=k&&k!=z&&j!=z)
{
dp[i][j][k]=(dp[i][j][k]+dp[i-1][k][z])%mod;
}
}
}
}
}
int res=0;
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(gcd(i,j)==1&&i!=j)res=(res+dp[n][i][j])%mod;
}
}
return res;
}
};