第一个,尺取法的简单题,但是就是一开始想用阶乘的,但是想了想,怕爆long long 然后就放弃了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MaxN = 1e5 + 10;
char a[MaxN];
int main()
{
//int x = fac(5);
// printf("%d",x);
int t ;
long long sum = 0;
scanf("%d",&t);
while(t--){
sum = 0;
scanf("%s",a);
for(int i = 0 ; i < strlen(a) ; i++){
long long ans = 0;
int j = i;
while(a[i] == 'q' && a[j] == 'q' && j < strlen(a)){
j++;
}
while(i < j){
ans += (j - i);
i++;
}
sum += ans;
}
printf("%I64d\n",sum);
}
return 0;
}
第二题,思想有点像埃氏晒素数的方法,那样做,其实,我在八点的时候看了一会《少年王》一天一更,如果我不看的话,可能会更高,还有就是这么回事,我觉得我以后再涨rating就很费劲了。我的代码能力还有待提高
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MaxN = 1e5 + 10;
int a[MaxN] , vis[MaxN] , num[MaxN] , cum[MaxN];
int main()
{
int t , n , cnt , flag1 = 0;
scanf("%d" , &t);
while(t--){
scanf("%d" , &n);
for(int i = 0 ; i < n ; i++)
scanf("%d" , &a[i]);
for(int j = 1 ; j <= n ; j++){
if(n % j == 0){//一个坑点,如果写在for的话,你会连循环都进不去
flag1 = 0;
memset(vis , 0 , sizeof(vis));
memset(num , 0 , sizeof(num));//存预设区间的值
memset(cum , 0 , sizeof(cum));//存比较区间的值
for(int i = 0 ; i < n ; i += j){
//printf("i\n");
if(i == 0){
cnt = -1;
for(int k = 0 ; k < j ; k++){//看预设区间的值
//printf("k\n");
num[++cnt] = a[k];
}
sort(num , num + cnt + 1);
}
int unt = -1;
for(int k = 0 ; k < j ; k++){//看比较区间的值
//printf("cum\n");
cum[++unt] = a[k + i];
}
sort(cum , cum + unt + 1);
int flag = 0;
for(int k = 0 ; k < cnt + 1 ; k++){
//printf("k1\n");
if(num[k] != cum[k]){
flag = 1;
break;
}
}
if(flag){
flag1 = 1;
break;
}
}
if(flag1) {continue;}
else {
if(j != n)
printf("%d ",j);
else printf("%d",j);
}
}
else continue;
}
printf("\n");
}
return 0;
}