DFS
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
struct oo
{
char head,tail;
}goubi[1000005];
int vis[1000005],var,flag,j;
char s[1000005];
int dfs(char ch)
{
if(ch=='m') //如果有m,返回主函数;
{
flag=1;
return 0;
}
else
{
for(int i=0;i<=var;i++) //循环输入的每一个字符串
{
if(vis[i]!=1&&goubi[i].head==ch)
{
vis[i]=1;
dfs(goubi[i].tail);
vis[i]=0;
}
}
}
return 0;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
int jilu=0,len;
var=flag=0;
memset(vis,0,sizeof(vis)); //先把所以未访问过的点全记为0;
if(strcmp(s,"0")==0) //如果输入的第一个字符串就为0,循环重新开始;
{
printf("No.\n"); continue;
}
if(s[0]=='b') jilu++; //判断首字母是不是b;
len=strlen(s);
goubi[var].head=s[0];
goubi[var].tail=s[len-1];
while(scanf("%s",s)!=EOF)
{
if(strcmp(s,"0")==0) //判断输入是不是0;
break;
len=strlen(s);
goubi[++var].head=s[0]; //分别记录字符串的首字母和尾字母;
goubi[var].tail=s[len-1];
if(s[0]=='b') jilu++; //判断首字母是不是b;
}
if(jilu==0) printf("No.\n"); //如果首字母中没有b,直接输出no;
else
{
for(j=0;j<=var;j++) //狗逼......
{
if(goubi[j].head=='b')
{
vis[j]=1; dfs('b');
if(flag==1) //如果在某个‘b’处找到了m,输入并break;
{
printf("Yes.\n");
flag=-1;
break; //break的位置一定要对!
}
}
}
if(flag==1) printf("Yes.\n");
else if(flag==0) printf("No.\n");
}
}
return 0;
}