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;
}