BZOJ3421: Poi2013 Walk

来源:互联网 发布:java开发校招笔试题 编辑:程序博客网 时间:2024/04/26 01:30

题解看commonc写的吧

时限从50s放到了100s,我53s过了/斜眼笑

想当年commonc开全局int i卡常才卡进去

喜闻乐见

#include<iostream>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<cstdlib>#include<cstdio>#include<map>#include<bitset>#include<set>#include<stack>#include<vector>#include<queue>using namespace std;#define MAXN 10000010#define MAXM 1010#define ll long long#define eps 1e-8#define MOD 10000007#define INF 1000000000int n,k;ll s,t;ll q[MAXN];int hd,tl;struct vec{ll to;int fro;};vec mp[MAXN];ll a[MAXN/10];int tai[MOD],cnt;inline void be(int x,ll y){mp[++cnt].to=y;mp[cnt].fro=tai[x];tai[x]=cnt;}bool vis(ll x){int i;int t=x%MOD;for(i=tai[t];i;i=mp[i].fro){if(mp[i].to==x){return 1;}}return 0;}void ins(ll x){int i;be(x%MOD,x);}bool bfs(ll s,ll t){ll x;int i;hd=tl=0;q[tl++]=s;int siz=1;memset(tai,0,sizeof(tai));cnt=0;ins(s);for(i=1;i<=k;i++){ins(a[i]);}while(hd!=tl){x=q[hd++];for(i=0;i<n;i++){ll y=x^(1ll<<i);if(t==y){printf("TAK\n");exit(0);}if(!vis(y)){q[tl++]=y;if(tl>n*k){return 1;}ins(y);}}}return 0;}int main(){int i,j;scanf("%d%d",&n,&k);char o[110];scanf("%s",o);for(i=0;i<n;i++){s*=2;s+=o[i]-'0';}scanf("%s",o);for(i=0;i<n;i++){t*=2;t+=o[i]-'0';}if(s==t){printf("TAK\n");return 0;}for(i=1;i<=k;i++){ll tmp=0;scanf("%s",o);for(j=0;j<n;j++){tmp*=2;tmp+=o[j]-'0';}a[i]=tmp;ins(tmp);if(tmp==t){printf("NIE\n");return 0;}}printf((bfs(s,t)&&bfs(t,s))?"TAK\n":"NIE\n");return 0;}/*60 0000000000000000000000000000000000000000000000000000000000000 111111111111111111111111111111111111111111111111111111111111*/


0 0
原创粉丝点击