arc069.contest.atcoder.jp/tasks/arc069_b
题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话。大家各自报自己的两边是同类还是不同类,问能否有一种满足每个人发言的方式。
解法:已知i-1和i-2可以推i,所以枚举起点羊羊、羊狼、狼羊、狼狼四种可能,最后拿第0只以及第n-1只动物的发言判断是否合法就行。
1 #include <cstdio> 2 int n; 3 char s[100001],r[100001]; 4 bool c(char a,char b) 5 { 6 r[0]=a; 7 r[1]=b; 8 for (int i=2; i<n; ++i) 9 r[i]=r[i-1]=='S'?s[i-1]=='o'?r[i-2]:r[i-2]=='S'?'W':'S':s[i-1]=='x'?r[i-2]:r[i-2]=='S'?'W':'S'; 10 return !(r[n-1]=='S'&&((s[n-1]=='o'&&r[n-2]!=r[0])||(s[n-1]=='x'&&r[n-2]==r[0])))&& 11 !(r[0]=='S'&&((s[0]=='o'&&r[1]!=r[n-1])||(s[0]=='x'&&r[1]==r[n-1])))&& 12 !(r[n-1]=='W'&&((s[n-1]=='x'&&r[n-2]!=r[0])||(s[n-1]=='o'&&r[n-2]==r[0])))&& 13 !(r[0]=='W'&&((s[0]=='x'&&r[1]!=r[n-1])||(s[0]=='o'&&r[1]==r[n-1]))); 14 } 15 int main() 16 { 17 scanf("%d%s",&n,s); 18 puts(c('S','W')||c('W','S')||c('W','W')||c('S','S')?r:"-1"); 19 return 0; 20 }