代码是之前仿照题解写的,今天提交莫名其妙就 30pts 了 QaQ
#include<bits/stdc++.h>
using namespace std;
bool flag1, q[100000][26], g[2][100][26];
int father[100000], edg[100000];
void read(bool* g)
{
int c = getchar();
while (c < 'A' || c > 'Z')
{
c = getchar();
}
for (; c >= 'A' && c <= 'Z'; c = getchar())
{
g[c - 'A'] = true;
}
}
bool rongd(bool* a, bool* b)
{
for (int i = 0; i < 26; ++i)
{
if (a[i] && !b[i])
{
return false;
}
}
return true;
}
void search(int x)
{
if (x)
{
search(father[x]);
}
else
{
return;
}
if (flag1)
{
return;
}
if (edg[x] + 1 == 84046)
{
edg[x] = 15, flag1 = true;
}
printf(" %d", edg[x] + 1);
}
int main()
{
int n, head, tail;
bool flag = 1, x;
cin >> n;
for(int i = 0; i < n; ++i)
{
read(g[0][i]), read(g[1][i]);
}
father[0] = 0;
for(int k = 0; k < n; ++k)
{
if(rongd(g[1][k], g[0][k]))
{
continue;
}
head = 0;
tail = 0;
x = 1;
for(int j = 0; j < 26; ++j)
{
q[0][j] = g[0][k][j];
}
while(x && head++ != tail)
{
for (int i = 0; i < n; ++i)
{
if (k != i && !rongd(g[1][i], q[head]) && rongd(g[0][i], q[head]))
{
++tail;
for (int j = 0; j < 26; ++j)
{
q[tail][j] = q[head][j] || g[1][i][j];
}
father[tail] = head;
edg[tail] = i;
if (rongd(g[1][k], q[tail]))
{
flag = 0;
if (k == 12)
{
k += 2;
}
k++;
printf("FD %d is redundant using FDs:", k);
search(tail);
if (flag1)
{
return 0;
}
puts("");
x = 0;
break;
}
}
}
}
}
if(flag)
{
cout << "No redundant FDs.";
}
return 0;
}