main(void)
{
int t;
cin>>t;
_0for(m,t)
{
char a[200],b[200];
unordered_map<char,int> mp;
mp.clear();
scanf("%s%s",a,b);
int la=strlen(a);
int lb=strlen(b);
if(lb<la)
{
printf("NO\n");continue;
}
for(int i=0;i<la;i++)
{
mp[a[i]]++;
}
int flag;
for(int i=0;i<=lb-la;i++)
{
flag=1;
unordered_map<char,int> mp1;
mp1.clear();
for(int j=i;j<i+la;j++)
{
mp1[b[j]]++;
}
for(int j=0;j<la;j++)
{
if(mp[a[j]]!=mp1[a[j]])
{
flag=0;
break;
}
}
if(flag)break;
}
if(flag==1)printf("YES\n");
else printf("NO\n");
}
}
main(void)
{
int t;
double a,b;
cin>>t;
_0for(m,t)
{
cin>>a>>b;
int l=0;
int r=abs(a-b);
int ans=9999999;
int cha=r;
while(l<=r)
{
int mid=(l+r)/2;
if(mid*(mid+1)/2<cha)
{
l=mid+1;
}
else
{
ans=min(mid,ans);
r=mid-1;
}
}
int anss=ans;
for(int i=ans;;i++)
{
if((i*(i+1)/2-cha)%2==0)
{
anss=i;
break;
}
}
printf("%lld\n",anss);
}
}
问题转化,1和2是抵消的关系,可以把写成-1,然后求前缀和
int s[100005],s2[100005],b[100005],t;
main(void)
{
cin>>t;
int n,p;
_0for(m,t)
{
int ans=9999999;
scanf("%d",&n);
map<int ,int> mp;
mp.clear();
mp[0]=-1;
_1for(i,n)
{
scanf("%d",&p);
if(p==2)p=-1;
s[i]=s[i-1]+p;
mp[s[i]]=i;
// debug(s[i]);
}
_1for(i,n)scanf("%d",&b[i]);
for(int i=n;i>=1;i--)
{
if(b[i]==2)b[i]=-1;
s2[i]=s2[i+1]+b[i];
// debug(s2[i]);
}
_1for(i,n+1)
{
if(mp[-s2[i]])
{
if(mp[-s2[i]]==-1)mp[-s2[i]]=0;
ans=min(ans,2*n-((n-i+1)+mp[-s2[i]]));
}
s2[i]=0;
}
printf("%d\n",ans);
}
}