//#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;
}
zoj 1011NTA
最新推荐文章于 2021-01-08 17:15:24 发布