看来写完成得自己先调试,尽量找到可能的错误。
一定自己先用几个特殊数据、大数据试验一下。
/*
* hdu-2209
* mike-w
* 2012-9-30
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 5555555
#define QSIZE 5555555
short tag[MAXSIZE];
int que[QSIZE], qhead, qtail, qlen;
int enque(int e)
{
que[qtail++]=e;
qtail%=QSIZE;
qlen++;
if(qlen==QSIZE)
abort();
return 0;
}
int deque(void)
{
int ret=que[qhead++];
qhead%=QSIZE;
qlen--;
return ret;
}
int main(void)
{
char buf[32];
while(scanf("%s", buf)!=EOF)
{
/* init*/
memset(tag, 0, sizeof(tag));
qhead=qtail=qlen=0;
int len=strlen(buf);
int v=0, i, w;
for(i=1, w=1; i<=len; i++, w<<=1)
v+=(buf[len-i]-'0')*w;
/* printf("v=%d\n", v); */
/* shortcut */
if(v==1 && len==1)
{
puts("1");
continue;
}
enque(v);
tag[v]=1;
while(qlen>0)
{
v=deque();
int m=7, t;
for(i=1; i+2<=len; i++, m<<=1)
if(!tag[t=v^m])
enque(t), tag[t]=tag[v]+1;
if(!tag[t=v^3])
enque(t), tag[t]=tag[v]+1;
if(!tag[t=v^(3<<(len-2))])
enque(t), tag[t]=tag[v]+1;
if(tag[0])
break;
}
if(tag[0])
printf("%d\n", tag[0]-1);
else
puts("NO");
}
return 0;
}