poj1733 & Ural 1003 Parity Game (hash+并查集 )

长度为n的0和1组成的字符串, 然后问第L和R位置之间有奇数个1还是偶数个1.

根据这些回答, 判断第几个是错误(和之前有矛盾)的。

一旦发现有矛盾了,要马上跳出循环, 后面的那些数据不用去管他了,否则如果用continue就WA。

#include <iostream>
#include <map>
#include <cstring>
using namespace std;

const int MAXX=10005;
int n,p,pre[MAXX],parity[MAXX];
map<int,int> numIndex;   //离散化 

int Find(int x)
{
    if(pre[x]==-1)
        return x;
    int f=Find(pre[x]);
    parity[x]=(parity[x]+parity[pre[x]])%2;
    pre[x]=f;
    return f;
}

bool Query(int x,int y,int odd)
{
     int r1,r2;
     r1=Find(x);
     r2=Find(y);
     if(r1==r2)
     {
         if((parity[x]+parity[y])%2==odd) return 1;
         else return 0;
     }
     else{
     pre[r1]=r2;
     parity[r1]=(parity[x]+parity[y]+odd)%2;
     return 1;
     }
}

void Solve()
{
     int i,x,y,index,idx1,idx2,odd;
     char s[10];
     cin>>n>>p;
     index=0;
     for(i=0;i<p;i++)
     {
         cin>>x>>y>>s;
         x--;
         if(numIndex.find(x)==numIndex.end())
             numIndex[x]=index++;
         idx1=numIndex[x];
         if(numIndex.find(y)==numIndex.end())
             numIndex[y]=index++;
         idx2=numIndex[y];
         if(strcmp(s,"odd")==0) odd=1;
         else odd=0;
         if(Query(idx1,idx2,odd)==false) break;
     }
     cout<<i<<endl;
}

void Init()
{
     memset(pre,-1,sizeof(pre));
}

int main()
{
    Init();
    Solve();
   // system("pause");
    return 0;
}
    

URAL上的AC代码:

#include <iostream>
#include <map>
#include <cstring>
using namespace std;

const int MAXX=10005;
int n,p,pre[MAXX],parity[MAXX];
map<int,int> numIndex;   //离散化 

int Find(int x)
{
    if(pre[x]==-1)
        return x;
    int f=Find(pre[x]);
    parity[x]=(parity[x]+parity[pre[x]])%2;
    pre[x]=f;
    return f;
}

bool Query(int x,int y,int odd)
{
     int r1,r2;
     r1=Find(x);
     r2=Find(y);
     if(r1==r2)
     {
         if((parity[x]+parity[y])%2==odd) return 1;
         else return 0;
     }
     else{
     pre[r1]=r2;
     parity[r1]=(parity[x]+parity[y]+odd)%2;
     return 1;
     }
}



    

int main()
{
     while(cin>>n&&n!=-1)
     {
     memset(pre,-1,sizeof(pre));
     memset(parity,0,sizeof(parity));
     numIndex.clear();
     int i,x,y,index,idx1,idx2,odd;
     char s[10];
     cin>>p;
     index=0;
     for(i=0;i<p;i++)
     {
         cin>>x>>y>>s;
         x--;
         if(numIndex.find(x)==numIndex.end())
             numIndex[x]=index++;
         idx1=numIndex[x];
         if(numIndex.find(y)==numIndex.end())
             numIndex[y]=index++;
         idx2=numIndex[y];
         if(strcmp(s,"odd")==0) odd=1;
         else odd=0;
         if(Query(idx1,idx2,odd)==false) break;
     }
      for(int ii=i+1;ii<p;ii++)
     {
         cin>>x>>y>>s;
     }
     cout<<i<<endl;
    
     }
   // system("pause");
    return 0;
}
    



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章