AtCoder Regular Contest 069 D - Menagerie 枚举起点 模拟递推

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 }

 

posted @ 2017-03-03 13:03  饼饼饼饼饼  阅读(330)  评论(0编辑  收藏  举报