class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param students int整型vector 
     * @param sandwiches int整型vector 
     * @return int整型
     */
    int countStudents(vector<int>& students, vector<int>& sandwiches) {
        // write code here
	  //本题有两种思路,此为第一种
	  //本题第一、第二种解分别来自“追风的雨汀”和“Silencer76”,笔者在看过思路后敲出,
	  //所以仅分享自己的思考,如有侵权联系删除!
	  
	  //第一种解法很直观,就是模拟两个队列的出入
        queue<int> a,b;//先定义两个队列

        for(int i=0;i<students.size();i++)
        {
            a.push(students[i]);
            b.push(sandwiches[i]);//将学生和三明治的数据分别入列

        }

        int k{};//计数器,用于记录学生队列的移动次数

        while(!a.empty())//如果学生的队列非空
        {
            if(a.front()==b.front())//此时需要判断两者队首是否相同,相同则双双出队
            {
                a.pop();
                b.pop();
                k=0;//将队列的移动次数归零
            }
            else if(a.front()!=b.front()&&k!=a.size())
			  //如果两个队首不同,将a的队首移到队尾,实现如下
			  
			  //后面的&&k!=a.size()很重要,因为else-if是从上到下,如果没有这句会陷入死循环
			  //如果不想写这句附加判断,实测将下面两个else-if调换位置也能通过
            {
                a.push(a.front());
                a.pop();
                k++;
            }
            else if(k==a.size())
			  //最后如果操作的次数达到a的长度,说明所有人都已经尝试过
			  //跟b的队首配对且都失败,此时退出循环
            {
                break;
            }
        }
        

        return a.size();

		//以下是第二种解法
        // int count[2]={0};//先定义count用于记录喜欢0型和1型的人数
        // for(int num:students)
	    // {
        //     count[num]++;
        // }
	  //上面这个用法对于遍历数组特别方便,相当于
	  
	  /*
	  for(int i=students.begin();i<students.end();i++)
		{
			int num=students(i)
			count[num]++;
		}
		*/
	  
	  //也就是定义一个变量num,对数组students的元素从左到右进行遍历,
	  //以上这段的意思是将对应的学生数量加加
	  
        
		//以下则是喜欢对应三明治的学生减减
        // for(int num: sandwiches)
        // {
        //     if(count[num]>0)//要注意大于0的条件,这说明栈顶的东西还有学生喜欢,否则就跳出循环
        //     count[num]--;
        //     else
        //     break;
        // }

        // int sum=count[0]+count[1];//剩余学生数量就是两个对应喜欢数量剩余人数的和
        // return sum;


    }
};