http://abc055.contest.atcoder.jp/tasks/arc069_b
题意: 一圈动物,有真诚的羊和套路的狼,羊说真话,狼说假话。 这些动物围成一圈,之后输入n,表示长度为n的字符串,输出只包含o,x的字符串,对于羊而言o表示他左右两边的动物和他一样,x表示左右两边的动物至少有一个和他不一样。 对于狼而言o表示左右两边的动物至少有一个和他不一样,x表示左右两边的动物和他一样。问你是否有满足这样条件的序列,如果有输出任意一个,否则输出-1
思路:
这个题挺无聊的,因为一开始我老想DFS处理所有狼和羊的情况,但好像代码量和判断条件过于复杂就放弃了。之后我想我可以假设两个的情况,这样我可以推第3个,之后第四个,依次类推到第n个。这样我每次推完就可以判定是否满足条件。
#include <bits/stdc++.h>
#define maxs 220020
#define mme(i,j) memset(i,j,sizeof(i))
#define ll long long
using namespace std;
bool vis[maxs];
char s[maxs];
bool check(int x,int y,int len){
vis[0]=x;
vis[1]=y;
for(int i=2;i<=len+1;i++){
if(vis[i-1]){
if(s[i-1]=='o') vis[i]=vis[i-2];
else vis[i]=!vis[i-2];
}else{
if(s[i-1]=='o') vis[i]=!vis[i-2];
else vis[i]=vis[i-2];
}
}
if(vis[len]==vis[0]&&vis[len+1]==vis[1]){
for(int i=0;i<len;i++){
if(vis[i])
printf("S");
else
printf("W");
}
puts("");
return 1;
}
return 0;
}
int main()
{
int n;
while(~scanf("%d",&n)){
scanf("%s",s);
int len=n;
s[len]=s[0];
s[len+1]=s[1];
s[len+2]='\0';
bool fl=0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
if(check(i,j,len) )
{
fl=1;
break;
}
}
if(fl) break;
}
if(!fl)
puts("-1");
}
return 0;
}