/************************* F. Features Track *****************************
链接:https://nanti.jisuanke.com/t/31458
题意:首先有1个n,n行,每行一个k表示这一行有k个点,然后输入这个k个点,问
最长连续多少行出现了相同的点
思路:map里pair存坐标对应int,一个记录连续次数,一个记录上一次出现在第几行
取最大值即可
****************************************************************************/
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int>mp1,mp2;
/** mp1记录次数,mp2记录上一次出现的地方 */
int main()
{
int t;
cin>>t;
while(t--){
int n,Max=0;
scanf("%d",&n);
mp1.clear();mp2.clear();
for(int i=1;i<=n;i++){
int k;
scanf("%d",&k);
while(k--){
int x,y;
scanf("%d%d",&x,&y);
if(mp2[make_pair(x,y)]==i) continue;
else if(mp2[make_pair(x,y)]==i-1||mp1[make_pair(x,y)]==0){
mp1[make_pair(x,y)]++;
mp2[make_pair(x,y)]=i;
}
else{
mp1[make_pair(x,y)]=1;
mp2[make_pair(x,y)]=i;
}
Max=max(Max,mp1[make_pair(x,y)]);
}
}
printf("%d\n",Max=Max<2?0:Max);
}
return 0;
}
/************************* G. Trace **********************************
链接:https://nanti.jisuanke.com/t/31459
题意:n个点,每次输入一个坐标,表示一个从(0,0)点开始的矩阵,后者会将前者
覆盖掉,如题目图片所示,求最终露在外面的周长,x,y两个点不会同时小于对应的xy
思路:set+二分
1.将x,y分别存到x数组,y数组,开两个set,s1记录x坐标的变化,s2记录y坐标的变化
2.由于后者会将前者覆盖,所以倒着匹配,利用lower_bound找到被覆盖的地方,将差值
相加,即为ans;
for(int i=n-1;~i;--i){
auto it=s1.lower_bound(x[i]);
ans+=x[i]-*--it;
s1.insert(x[i]);
it=s2.lower_bound(y[i]);
ans+=y[i]-*--it;
s2.insert(y[i]);
}
代码解释:
1.s1.lower_bound()的返回值为set的迭代器,是一个地址,所表达的值是x[i]在set中的地址,
因为set有自动排序以及去重的功能,所以--it表示比x[i]小的那个值的地址,*--it表示该值
2.auto表示定义变量自动匹配数据类型,迭代器的标准定义方法为
set<int>::iterator it;
3.倒着遍历,找到上一个比他小的值求差,就可剪掉被覆盖部分,然后把这些差值加起来,即为ans
*************************************************************************/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5+5;
int x[maxn],y[maxn];
set<int>s1,s2;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]);
s1.insert(0),s2.insert(0);
ll ans=0;
for(int i=n-1;~i;--i){
auto it=s1.lower_bound(x[i]);
ans+=x[i]-*--it;
s1.insert(x[i]);
it=s2.lower_bound(y[i]);
ans+=y[i]-*--it;
s2.insert(y[i]);
}
printf("%lld\n",ans);
return 0;
}
/******************************** I. Characters with Hash *****************************
链接:https://nanti.jisuanke.com/t/31461
题意:给出一个n为字符串的长度,给出一个字符,使计算出字符串每个字符与该字符的差的绝对值,
每个值都是两位数,保持前导0,把这些数字拼接起来,去掉前导0,问新的串的长度
思路:
1.遇到第一个不一样的,判断差的长度为1还是2,然后计算剩下的长度再加1或2即可
2.当全部一样即字符串结果为0时,ans=1,因为长度为1;
******************************************************************************************/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,ans,s=0;
char x,a[1000005];
cin>>n>>x>>a;
for(int i=0;i<n;i++){
if(x==a[i]) s++;
else break;
}
ans=abs(x-a[s])<10?(n-s)*2-1:(n-s)*2;
if(ans==0) ans=1;
cout<<ans<<endl;
}
return 0;
}