Problem p02721 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a)) // 数组(结构体)清零
#define ll long long
// int A(int a,int b){if(a<b||a<1||b<0)return 0;int
// k=1;while(b--){k*=a--;}return
// k;}//数学中的Aab,传递ab,返回Cab//类型为int//如果不符合条件则返回0 int C(int
// a,int b){if(a<b||a<1||b<0)return 0;b=min(a-b,b);int
// k=A(a,b),t=1;while(--b)k/=++t;return
// k;}//数学中的Cab,传递ab,返回Cab//类型为int//如果不符合条件则返回0 int
// HW(char*HWa,int HWl,int HWr){if(HWr<HWl)swap(HWl,HWr);for(int
// i=0;i<(HWr-HWl)/2+1;i++)if(HWa[HWl+i]!=HWa[HWr-i])return 0;return
// 1;}//传递字符串名,判断区间l r,如果是回文字符串就返回1,否则返回0 int SS(int
// a){if(a>4&&((a-1)%6)&&((a+1)%6))return 0;for(int
// i=2;i<=sqrt(a);i++)if(a%i==0)return 0;return 1;}//判断一个数是不是质数，是1
// 否0；请确保a>1;
/*记得如果改int为long long,就把printf与scanf中相应的%d也改成%lld*/
// char c[200010];
// bool b[200010];
// int main()
//{
//	int n,i,k,C,s,j,flag;//共n天 ,一次隔C天，共需要k天
//	scanf("%d%d%d%s",&n,&k,&C,c);
//	//int ge=C+1;
//	for(i=0;i<n;i++)
//	{
//		if(c[i]=='o')b[i]=1;
//	}
//	//for(i=0;i<n;i++)cout<<b[i]<<"***\\n";//**********
//	for(i=0;i<n;i++)
//	{
//		bool t=b[i];
//		b[i]=0;//如果这天不工作
//		for(flag=0,s=0,j=0;j<n;j++)
//		{
//			//printf("j=%d,",j);//*************
//			if(b[j])s++,j+=C;//结束循环后j++，正好C+1
//			//printf("s=%d\\n",s);//************
//			if(s>=k) {flag=1;break;}
//		}
//		//printf("i=%d,flag=%d\\n",i,flag);//*******
//		if(!flag)printf("%d\\n",i+1);
//		b[i]=t;
//	}
//	return 0;
// }
int p[200010];
char c[200010];
int main() {
  int n, C, k, j, i;
  cin >> n >> k >> C >> c;
  if (C) {
    for (j = k - 1, i = n - 1; j >= 0; i--) {
      if (c[i] == 'o') {
        if (c[i] == 'o')
          p[j--] = i, i -= C;
      }
    }
    // printf("j=%d\\n",j);//**********
    for (i = j = 0; j < k; i++) {
      if (c[i] == 'o') {
        if (p[j++] == i)
          printf("%d\\n", i + 1);
        i += C;
      }
    }
  } else {
    int sum = 0;
    for (i = 0; i < n; i++)
      if (c[i] == 'o')
        sum++;
    if (sum == k)
      for (i = 0; i < n; i++) {
        if (c[i] == 'o')
          printf("%d\\n", i + 1);
      }
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a)) // 数组(结构体)清零
#define ll long long
// int A(int a,int b){if(a<b||a<1||b<0)return 0;int
// k=1;while(b--){k*=a--;}return
// k;}//数学中的Aab,传递ab,返回Cab//类型为int//如果不符合条件则返回0 int C(int
// a,int b){if(a<b||a<1||b<0)return 0;b=min(a-b,b);int
// k=A(a,b),t=1;while(--b)k/=++t;return
// k;}//数学中的Cab,传递ab,返回Cab//类型为int//如果不符合条件则返回0 int
// HW(char*HWa,int HWl,int HWr){if(HWr<HWl)swap(HWl,HWr);for(int
// i=0;i<(HWr-HWl)/2+1;i++)if(HWa[HWl+i]!=HWa[HWr-i])return 0;return
// 1;}//传递字符串名,判断区间l r,如果是回文字符串就返回1,否则返回0 int SS(int
// a){if(a>4&&((a-1)%6)&&((a+1)%6))return 0;for(int
// i=2;i<=sqrt(a);i++)if(a%i==0)return 0;return 1;}//判断一个数是不是质数，是1
// 否0；请确保a>1;
/*记得如果改int为long long,就把printf与scanf中相应的%d也改成%lld*/
char c[200010];
bool b[200010];
int main() {
  int n, i, k, C, s, j, flag; // 共n天 ,一次隔C天，共需要k天
  scanf("%d%d%d%s", &n, &k, &C, c);
  // int ge=C+1;
  for (i = 0; i < n; i++) {
    if (c[i] == 'o')
      b[i] = 1;
  }
  // for(i=0;i<n;i++)cout<<b[i]<<"***\\n";//**********
  for (i = 0; i < n; i++) {
    bool t = b[i];
    b[i] = 0; // 如果这天不工作
    for (flag = 0, s = 0, j = 0; j < n; j++) {
      // printf("j=%d,",j);//*************
      if (b[j])
        s++, j += C; // 结束循环后j++，正好C+1
      // printf("s=%d\\n",s);//************
      if (s >= k) {
        flag = 1;
        break;
      }
    }
    // printf("i=%d,flag=%d\\n",i,flag);//*******
    if (!flag)
      printf("%d\\n", i + 1);
    b[i] = t;
  }
  return 0;
}