最小01串
题目描述
小可有一个只由01构成的字符串s,如果si是1并且si+1是0,那么我们可以删除si、si+1这两个字符的任意一个。
请问经过有限次操作(可能是零次)之后,这个字符串的字典序最小的结果是什么?
输入描述
第一行一个正整数T(1≤T≤104),表示有T组输入。
对于每组输入,第一行一个正整数n(1≤n≤105),表示字符串s的长度。
第二行字符串s,只由0101两种字符构成。
保证T组的n的和不超过105。
输出描述
对于每组输入,输出一行字符串,如题所示。
样例输入
5
10
0001111111
4
0101
8
11001101
10
1110000000
1
1
样例输出
0001111111
001
01
0
1
代码
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int t,n,s[100005];
int main(){
cin>>t;
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%1d",&s[i]);
}
s[0]=s[n+1]=-1;
int l=1,r=n;
while(s[l]==0){
l++;
}
while(s[r]==1){
r--;
}
if(l>r){
for(int i=1;i<=n;i++){
printf("%d",s[i]);
}
printf("\n");
}
else{
for(int i=1;i<l;i++){
printf("%d",s[i]);
}
printf("0");
for(int i=r+1;i<=n;i++){
printf("%d",s[i]);
}
printf("\n");
}
}
return 0;
}
平方数对
题目描述
小可有一个序列,序列中有n个元素a1,a2,⋯,an。
小可想知道,有多少个数对(i,j),满足1≤i<j≤n,且ai×aj是完全平方数。
输入描述
第一行一个正整数n(2≤n≤2×105)
第二行是这个序列a1,a2,⋯,an(0≤ai≤2×105)
输出描述
如题,输出一个整数,代表有多少个满足题目要求的(i,j)数对。
样例输入
8
2 2 4 6 3 100 100 25
样例输出
7
代码
#include<iostream>
using namespace std;
#define ll long long
const int N=2e5+10;
int n,a[N];
int v[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int j=2;j*j<=a[i];j++){
while(a[i]%(j*j)==0){
a[i]/=j*j;
}
}
}
ll ans=0;
for(int i=1;i<=n;i++){
if(!a[i]){
ans+=i-1;
}
else{
ans+=v[a[i]]+v[0];
}
v[a[i]]++;
}
printf("%lld",ans);
return 0;
}