补题*总结题21/9/14

B - Unexpressed

题解链接
题目链接:AtCoder - abc193_c

G - A ^ B ^ C AtCoder - arc113_b (找规律)

题意:
给定三个数A,B,C,求出 a ^b ^c的个位上的数。

思路

  • 只需求解个位上数,所以A的个位以上的数对结果无影响,所以我们对A取余。

  • 找规律,我们发现0-9中每个数的n次方的个位上的数是具有规律性的,结果如下:
    image

  • 利用快速幂计算,对a所在周期取余的结果

  • 在记录a的n次幂的个位的数组中输出结果。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x7fffffff
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int abc[10][5];
ll pm(ll b,ll c,ll mod)
{
    ll res = 1;
    while(c)
    {
        if(c & 1)
        {
            (res *= b)%= mod;
        }
        c >>= 1;
        (b*=b)%= mod;
    }
    return res;
}


int main()
{
    IOS;
    int a,b,c;
    abc[2][0] = 6;abc[2][1] = 2;abc[2][2] = 4;abc[2][3] = 8;
    abc[3][0] = 1;abc[3][1] = 3;abc[3][2] = 9;abc[3][3] = 7;
    abc[4][0] = 6;abc[4][1] = 4;
    abc[7][0] = 1;abc[7][1] = 7;abc[7][2] = 9;abc[7][3] = 3;
    abc[8][0] = 6;abc[8][1] = 8;abc[8][2] = 4;abc[8][3] = 2;
    abc[9][0] = 1;abc[9][1] = 9;

    cin >>a>>b>>c;
    a=a%10;
    if(a ==0||a==1||a ==5||a ==6)
    {
        cout<<a<<endl;
    }
    else
    {
        if(a ==4 ||a==9)
        {
            ll bc=pm(b,c,2);//两个数循环
            cout<<abc[a][bc]<<endl;
        }
        else
        {
            ll bc=pm(b,c,4);//四个数循环
            cout<<abc[a][bc]<<endl;
        }
    }
    system("pause");
    return 0;
}

H - String Invasion AtCoder - arc113_c

题意:
给定字符串s
在S中选择三个连续的字符,
使得 s i = s i + 1 ≠ s i + 2 ,将 s i + 2 替换为 s i 。
求最多替换的次数。

思路:

  • 从后往前遍历字符串,记录各字符的出现次数。
  • 当到符合题意位置q时,
    • 让结果加上s[q]后面字符串的长度,
    • 再减去s[q]在后面的字符串中的出现次数(相同的字符不用修改)
  • 因为后面的字符串已经被改动,
    • 所以要重置记录字符出现次数的数组。
    • 并且将s[q] 的出现次数改为:后面字符串的长度。
  • 循环进行上述过程,直到字符串全都遍历。
    代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int cnt[30];
int main()
{
    memset(cnt,0,sizeof cnt);
    string s;
    cin>>s;
    int len = s.length();
    ll ans=0;
     cnt[s[len-1]-'a']++;
     cnt[s[len-2]-'a']++;
      for(int i = len-3;i >= 0;i--)
    {

        if(s[i]==s[i+1]&&s[i+1]!=s[i+2])
        {
            ans+=len-(i+1)-cnt[s[i]-'a' ];
            memset(cnt,0,sizeof cnt);
             cnt[s[i]-'a'] = len-(i+1);
        }
         cnt[s[i]-'a']++;
    }

    cout<<ans<<endl;
    return 0;
}
posted @ 2021-09-16 15:32  kingwzun  阅读(32)  评论(0编辑  收藏  举报