As the only Oni (a kind of fabulous creature with incredible strength and power) living on the surface of Gensokyo, Ibuki Suika has an interest in gatheringHumans and Youkai in Gensokyo and holding party every day.
Today Suika has asked several friends to participate in a weekend party, which will be held at Hakurei Shrine as usual. Though Gensokyo was isolated from the outside world, everyone here is still a fan of ACG (Anime, Comic and Game). Of course, some people may only like parts of ACG. For example, Reimulikes Anime and Game, Marisa only likes Comic but Kaguya likes all of them.
In order to make everyone enjoy the party, Suika decide to arrange them into a circle so that everyone can have at least one common interest with both left and right hand side, which means one has at least a common interest with left AND has at least a common interest with right. By the way, Suika knows all her friends' interest. Please find out if she can get an arrangement of seats that satisfies the constraint described above.
Input
There are multiple test cases. For each test case:
The first line contains an integer N (1 <= N <= 64) indicates the number of girls in Gensokyo. Then followed by N lines, each line contains two strings Ai andBi (each contains only alphanumeric characters). Ai represents the name of the i-th girl and the length of it will not exceed 10. Bi is a non-empty subset of "ACG".
Output
For each test case, output "Yes" if there exists at least one arrangement of seats, otherwise output "No".
Sample Input
1 Reimu AG 2 Reimu AG Marisa C 3 Reimu AG Marisa C Kaguya GAC
Sample Output
Yes No No
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
int n;
string s,a;
int main()
{
while(~scanf("%d",&n))
{
map<string,int>mp;
for(int i=0;i<n;i++)
{
cin>>a>>s;mp[s]++;
}
int A=mp["A"];
int C=mp["C"];
int G=mp["G"];
int AG=mp["AG"]+mp["GA"];
int AC=mp["AC"]+mp["CA"];
int GC=mp["GC"]+mp["CG"];
int AGC=mp["AGC"]+mp["ACG"]+mp["CGA"]+mp["CAG"]+mp["GCA"]+mp["GAC"];
//cout<<"A="<<A<<" "<<"C="<<C<<" "<<"G="<<G<<endl;
//cout<<"AG="<<AG<<" "<<"AC="<<AC<<" "<<"GC="<<GC<<endl;
//cout<<"AGC="<<AGC<<endl;
if( (A+AC+AG+AGC==n) || (C+AC+AGC+GC==n) || (G+AG+GC+AGC==n) )//一个
{
puts("Yes");
//cout<<"********1"<<endl;
continue;
}
if( (A==0&&(GC+AGC>=2)) || (C==0 && (AG+AGC)>=2 ) || (G==0 && (AC+AGC)>=2 ))//两个
{
puts("Yes");
//cout<<"********2"<<endl;
continue;
}
if( (AG?1:0)+(GC?1:0)+(AC?1:0)+AGC>=3 )//三个
{
puts("Yes");
//cout<<"********3"<<endl;
continue;
}
if( (AC>=2&&AG>=2) || (AG>=2&&GC>=2) || (GC>=2&&AC>=2) )//三个
{
puts("Yes");
//cout<<"********4"<<endl;
continue;
}
//对于这种没有的情况,其实上面已经包含了,例如:如果只有AC AG GC中的两个(AGC比较特殊,可以无所谓)那么在第一种情况就判断了,可以输出Yes,如果三个都有,那
//么在第三种情况也会考虑到,所以输出Yes.
// if( (A==0&&C==0&&G==0) && ( (AG>=1&&AC>=1) || (AC>=1&&GC>=1) || (GC>=1&&AG>=1) || AGC>=2) )//没有
// {
// puts("Yes");
// //cout<<"********4"<<endl;
// continue;
// }
puts("No");
}
return 0;
}
/*
5
fd A
fdfd G
fsd C
ds AG
fsf CA
*/