2022/2/9总结

1、奶牛哞叫

通过map映射来做,将a串的字符从前到后,和从后到前都给他赋字符个数的value,再在b串中找,从前与a的从后map对应,如果是相同的就会得到字符个数,不同即为0

#include<iostream>
#include<map>
#include<algorithm>
#include<cstdio>
using namespace std;
map<string,int>a,b;//存s1的前后缀
string s1,s2,qs1,hs1,qs2,hs2;
int ans;
int main()
{
  cin >> s1 >> s2;
  for(int i=0;i<s1.length();i++) //遍历s1,在map建立前缀后缀的映射关系
    {
        qs1+=s1[i];
        a[qs1]=i+1;
    }
    for(int i=s1.length()-1;i>=0;i--)
    {
        hs1=s1[i]+hs1;
        b[hs1]=s1.length()-i;
    }
    for(int i=0;i<s2.length();i++)//遍历s2,用s2的前缀在s1的后缀映射找是否存在
    {
        qs2+=s2[i];
        ans=max(ans,b[qs2]);
    }
    for(int j=s2.length()-1;j>=0;j--)
    {
        hs2=s2[j]+hs2;
        ans=max(ans,a[hs2]);
    }
    cout << ans;

}

2点名

因为每个名字都不一样,就将每个名字映射成一个int值,点名时查询map里面是否有这个名字,有的就输出ok再将map映射改为-1代表这个名字已经被叫过

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
map<string ,int>ma;
int n,m;
string a;
int main()
{
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> a;
        ma[a]=i;
    }
    cin >> m;
    for(int i=1;i<=m;i++)
   {
       cin >> a;
       if(ma[a]==0)cout << "WRONG"<< endl;
       else if(ma[a]!=-1)
       {
           cout << "OK" << endl;
           ma[a]=-1;
       }
       else cout << "REPEAT" << endl;
       
   }
}

3、数对

a-b=c可以转换成a-c=b

我们将所有的数用map进行一下桶排,再在map中把所有的符合要求的桶排相加;

注意此题的数据范围

#include<iostream>
#include<map>
#include<algorithm>
#include<cstdio>
using namespace std;
const int max_n=1e7;
typedef  long long ll;
map<ll,ll>m;
ll a[max_n];
int main()
{
   ll n;
   cin >> n;
   ll c;
   cin >> c;
   for(ll i=0;i<n;i++)
   {
       cin >> a[i];
       m[a[i]]++;//桶排
       a[i]-=c;//转为答案b值
   } 
   ll sum=0;
   for(ll i=0;i<n;i++)
   {
       sum+=m[a[i]];//查找map中b的个数也就是答案的个数
   }
   cout << sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值