zoj 1011NTA

//#include <cstdlib>

#include <iostream>



#define MAXN 15 

#define MAXK 10

#define MAXL 10



using namespace std;



int m, n, k;

struct mypair{

       int a, b;

       mypair *next;

       void insert(int l, int r)

       {

            if (next) 

            { 

                      next->insert(l, r); 

                      return; 

            }

            mypair* p = new mypair;

            p->next = NULL;

            p->a = l; p->b = r;

            next = p;

       };

       

       void clear()

       {

            mypair*p = next, *q;

            while (p)

            {

                  q = p->next; 

                  delete p;

                  p = q;

            }

            next = NULL;

       }

}trans[15][10];



int nodeType[4096];



// n : num of singnals

//m : num of acceptable signals

// k : num of translating elements



int L;



void readTree()

{     

     memset(nodeType, -1, sizeof(nodeType));  

     char tpe;

     for (int i = 1; i <= (1<<(L+1)) - 1; i++)

     {

         cin>>tpe;

         if (tpe == '*')

         {

             nodeType[i] = -1;

         }

         else

         {

             nodeType[i] = tpe - 'a';

         }

     }

}

int isValide[4096][15];

int  dp()

{

     for (int i = (1 << (L+2))-1; i > 0; i--)

     {

         if (nodeType[i] == -1)

         {

           for (int  sig = 0; sig < n; sig++)

             isValide[i][sig] = sig >= n - m;

           continue;

         }

         for (int sig = 0; sig < n; sig++)

         {

             isValide[i][sig] = 0;

             mypair *p = trans[sig][nodeType[i]].next;

             while(p)

             {

                     if (isValide[i*2][p->a] && isValide[i*2+1][p->b])

                     {   isValide[i][sig] = 1;

                        break;

                     }

                     p = p->next;

             }

         }

     }

     return isValide[1][0];

}



void readTable()

{

     for (int i = 0; i < n;  i++)

       for (int j = 0; j < k; j++)

       {

           int a, b;

           while (true)

           {

                 cin>>a>>b;                 

                 trans[i][j].insert(a,b);

                 if ( cin.get() == '/n' ) break;

           }

       }

}



int main(int argc, char *argv[])

{   

    int num=1;

    while (true)

    {

     cin>>n>>m>>k;

     if (n == 0 && m == 0 && k == 0) break;

     if (num > 1) cout<<endl;

     cout<<"NTA"<<num++<<":"<<endl;

     

     readTable();     

     while (true)

     {

        cin>>L;

        if (L == -1) break;        

        readTree(); 

        memset(isValide, 0, sizeof(isValide));       

        if( dp())

            cout<<"Valid/n";

        else cout<<"Invalid/n";        

     }

     

     //free pairs

     for (int i = 0; i < n; i++)

        for (int j = 0; j  < k; j++)

           trans[i][j].clear();

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值