#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define MPC 1063
#define WAR 2000
 
typedef struct StringNode{
    int *str;
    int leng;
    int flg;
    int *num;
}SNode;
 
int n,cnt = 0;

int med3(int x, int y, int z)
{
    if( x < y )
    {
    	if( y < z )
    	{
    		return y;
    	}
    	else if( z < x )
    	{
    		return x;
    	}
    	else
    	{
    		return z;
    	}
    }
    else
    {
    	if( z < y )
    	{
    		return y;
    	}
    	else if( x < z )
    	{
    		return x;
    	}
    	else
    	{
    		return z;
    	}
    }
}


void quickSort(SNode A,int p, int r)
{
    if(p < r)
    {
    	int i=p, j=r;
    	int tmp, pibot = med3( A.str[i], A.str[i+(j-i)/2], A.str[j] );
    	//tmp 格納場所　pibot 中央値
    	while(1)
    	{
    		while( A.str[i] < pibot ) i++;
    		while( pibot < A.str[j] ) j--;
    		if( i >= j ) break;

    		tmp = A.str[i];
    		A.str[i] = A.str[j];
    		A.str[j] = tmp;
    		tmp = A.num[i];
    		A.num[i] = A.num[j];
    		A.num[j] = tmp;
    		i++;
    		j--;
    	}
        quickSort(A, p, i - 1);
        quickSort(A, j + 1, r);
    }
}

SNode init_Snode(SNode A,int Tlen)
{
    A.str = malloc(sizeof(int)*Tlen);
    A.leng = 0;
    A.flg = 0;
    A.num = malloc(sizeof(int)*Tlen);
    return A;
}



/* 対象が検索してる文字と同じかどうか */
/*void Search(int Tcp[],char T[],char P[], int Pcp,int Tlen,int Plen)
{
    int flg = 0,i;
     
    //printf("Plen = %d,Pcp = %d\n",Plen,Pcp);
    /*    検索 */
   /* for(i=0;i<=Tlen-Plen;i++)
    {
        //printf("%2d ",Tcp[i]);
        if(Tcp[i]==Pcp)
        {
            if(strncmp(&T[i],&P[0],Plen)==0)
            {
                flg = 1;
                //printf("congrache \n");
                break;
            }
        }
    }
    if(flg == 1) printf("1\n");
    else printf("0\n");
}*/

/* quickSort_Ver 検索 2分探索 */
void Search(SNode B,char T[],char P[],int Pcp,int Tlen,int Plen)
{
    int i=0,j = Tlen-1,IJ,flg = 0;
    cnt = 0;
    //printf("pcp = %d\n",Pcp);
    //printf("初期値 i = %d,j = %d, ",i,j);
    
    /* 2分探索 */
    while(i <= j)
    {
        //cnt ++;
        //if(100 < cnt) break;
        IJ = i + (j-i) / 2;
        //printf("IJ = %d ",IJ);
        if(IJ == 0)
        {
            //printf("IJ 0 ");
            if(strncmp(&T[B.num[0]],&P[0],Plen)==0)
            {
                flg = 1;
            }
            break;
        }
        /* hashが同じ場合 */
        if(B.str[IJ] == Pcp){
            //printf("\ncongrach ,");
            int IJcp = IJ;
            
            /* hashが同じでも衝突を起こしている可能性がある為、前後も探す */
            while(B.str[IJcp] == Pcp)
            {
                //printf("%d,",IJcp);
                if(memcmp(&T[B.num[IJcp]],&P[0],Plen)==0)
                {
                    flg = 1;
                    break;
                }
                IJcp -= 1;
            }
            if(flg == 1){
                break;
            }
            IJcp = IJ;
            while(B.str[IJcp] == Pcp)
            {
                //printf("%d,",IJcp);
                if(memcmp(&T[B.num[IJcp]],&P[0],Plen)==0)
                {
                    flg = 1;
                    break;
                }
                IJcp += 1;
            }
            break;
        }else if(Pcp < B.str[IJ]){
            j = IJ-1;
            //printf("j- ");
        }else if(B.str[IJ] < Pcp){
            i = IJ+1;
            //printf("i+ ");
        }
        
        //printf("i = %d,j = %d,IJ=%d\n",i,j,IJ);
    }
    if(flg == 1) printf("1\n");
    else printf("0\n");
    return;
}
 
/* hash値を作成*/
void hash(char T[],char P[],int Tlen,int Plen,SNode *SN,int Tcp[])
{
    int i,j,Pcp=0,M = MPC;
    ///Tcp = &SN[Plen].str;
    //printf("Pcp?? = %d ,",Pcp);
    
    /* 検索する対象をhash化 */
    for(i=0;i<Plen;i++)
    {
        Pcp += P[i] * M % WAR;
        M += M;
    }
    
    //printf("Pcp?? = %d ,",Pcp);
    
    //printf("SN[%d].flg = %d\n",Plen,SN[Plen].flg);
    
    /* 一度作成されているhashであれば工程をスキップし、検索に遷移させる */
    if(SN[Plen].flg == 0){
        cnt++;
        
        //printf("chk flg 0\n");
        /* char型をhash化(Plenの長さで調整) */
        for(i=0;i<=Tlen-Plen;i++)
        {
            M = MPC;
            SN[Plen].str[i] = 0;
            
            for(j=0;j<Plen;j++)
            {
                SN[Plen].str[i] += (int)T[i+j] * M % WAR;
                M += M;
            }
            SN[Plen].num[i] = i;
            
        }
        SN[Plen].leng = Plen;
        SN[Plen].flg = 1;
        
        quickSort(SN[Plen],0,Tlen-Plen);
        
    }
    //printf("Tlen %d\n",Tlen);
    Search(SN[Plen],T,P,Pcp,Tlen-Plen+2,Plen);
}
 
 
int main()
{
    int i,j,Tlen,Plen,flg;
    char T[1000000];
    char P[1000];
    SNode SN[1001];
     
    scanf("%s",T);
    scanf("%d",&n);
    Tlen = strlen(T);
    int *Tcp = malloc(sizeof(int)*Tlen);
     
    /* 構造体の初期化 
    for(i = 0; i<=1000 ; i++)
    {
        SN[i] = init_Snode(SN[i],Tlen);
    }
    
    /* 検索 */
    for(i = 0;i<n;i++)
    {
        flg = 0;
        scanf("%s",P);
        Plen = strlen(P);
        
        if(Plen == 1)
        {
             
            for(j = 0;j<Tlen;j++)
            {
                if(T[j]==P[0])
                {
                    flg = 1;
                    break;
                }
            }
             
            //printf("chk1\n\n");
            if(flg == 1)
                printf("1\n");
             
            else
                printf("0\n");
                 
        }
         
        else if(Tlen < Plen)
        {
            printf("0\n");
        }
         
        else
        {
            if(SN[Plen].flg == 0)
                SN[Plen] = init_Snode(SN[Plen],Tlen);
            //printf("Tlen = %d,Plen = %d\n",Tlen,Plen);
            hash(T,P,Tlen,Plen,SN,Tcp);
        }
    }
     
     
    free(Tcp);
    return 0;
}
