#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define pi 3.141592653589793238
#define int long long
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

int rgt[200005];
int lft[200005];
pair<int,int> aag[800005];
int pic[800005];

void upd1(int ver,int tl,int tr,int pos,pair<int,int>val)
{
   if(tl==tr)
      aag[ver]=val;
   else
   {
      int tm=(tl+tr)/2;
      if(tm>=pos)
         upd1(2*ver,tl,tm,pos,val);
      else
         upd1(2*ver+1,tm+1,tr,pos,val);
      if(aag[2*ver].first!=aag[2*ver+1].first)
         aag[ver]=max(aag[2*ver],aag[2*ver+1]);
      else
         aag[ver]=min(aag[2*ver],aag[2*ver+1]);
   }   
}

void upd2(int ver,int tl,int tr,int pos,int val)
{
   if(tl==tr)
      pic[ver]=val;
   else
   {
      int tm=(tl+tr)/2;
      if(tm>=pos)
         upd2(2*ver,tl,tm,pos,val);
      else
         upd2(2*ver+1,tm+1,tr,pos,val);
      pic[ver]=max(pic[2*ver],pic[2*ver+1]);
   }   
}

pair<int,int> get1(int ver,int tl,int tr,int l,int r)
{
   if(tl>tr||l>r||tr<l||r<tl)
      return {0,0};
   else if(tl==l&&tr==r)
      return aag[ver];
   else
   {
      int tm=(tl+tr)/2;
      pair<int,int>p1=get1(2*ver,tl,tm,l,min(tm,r));
      pair<int,int>p2=get1(2*ver+1,tm+1,tr,max(tm+1,l),r);
      if(p1.first!=p2.first)
         return max(p1,p2);
      return min(p1,p2);
   }   
}

int get2(int ver,int tl,int tr,int l,int r)
{
   if(tl>tr||l>r||tr<l||r<tl)
      return 0;
   else if(tl==l&&tr==r)
      return pic[ver];
   else
   {
      int tm=(tl+tr)/2;
      return max(get2(2*ver,tl,tm,l,min(tm,r)),get2(2*ver+1,tm+1,tr,max(tm+1,l),r));
   }   
}

signed main()
{
     ios_base::sync_with_stdio(false);
     cin.tie(NULL);  
     cout.tie(0);   
 #ifndef ONLINE_JUDGE
    if(fopen("INPUT.txt","r"))
    {
    freopen ("INPUT.txt" , "r" , stdin);
    freopen ("OUTPUT.txt" , "w" , stdout);
    }
 #endif
 
// -------------------------------------Code starts here---------------------------------------------------------------------     

   int n,k,c;
   cin>>n>>k>>c;
   string s;
   cin>>s;
   s="#"+s;
   
   for(int i=1;i<=n;i++)
   {
      upd1(1,1,n,i,{0,i});
   }

   for(int i=1;i<=n;i++)
   {
      if(s[i]=='o')
      {
         pair<int,int> mx=get1(1,1,n,1,max(i-c-1,0LL));
         upd1(1,1,n,i,{mx.first+1,i});
      }
   }

   for(int i=n;i>=1;i--)
   {
      if(s[i]=='o')
      {
         int mx=get2(1,1,n,min(i+c+1,n+1),n);
         upd2(1,1,n,i,mx+1);
      }
   }

   vector<int>ans;

   for(int i=1;i<=n;i++)
   {
      if(s[i]=='x')
         continue;
      pair<int,int> ans1=get1(1,1,n,1,i-1);
      int ans2=0;
      if(ans1.second==0)
         ans2=get2(1,1,n,i+1,n);
      else
         ans2=get2(1,1,n,max(i+1,ans1.second+c+1),n);

      if(ans1.first+ans2<k)
         ans.push_back(i);
   }

   for(auto i:ans)
      cout<<i<<'\n';
   
// -------------------------------------Code ends here------------------------------------------------------------------
     clock_t clk;
 	clk = clock();
 
    clk = clock() - clk;
 	cerr << fixed << setprecision(6) << "Time: " << ((double)clk)/CLOCKS_PER_SEC << "\n";
 	return 0;
 }
 

Measured memory_bytes: 20168