Au爷faebdc:"神犇来做猪国杀吧,我自己做太蛋疼了"
蒟蒻:"好吧"
Au爷faebdc“我过了”
蒟蒻:"......"
Au爷faebdc:"我rank1了"
蒟蒻:"......"
一天后
蒟蒻:"我过了"
Au爷faebdc:"......"
-----------------------------------------------------------------------
被机房各种神犇D,但我觉得模拟比其他(data struture)都好写多了......
太弱各种傻逼调了好久
纪念纯手写10k+
刷rank失败真是233
没什么说的了
代码太丑不想贴了
算了还是贴吧
Code:
#include <cstdio>
#include <cstring>
using namespace std;
#define N 11
#define M 2001
#define js() ((!alive) || (zgs))
struct shenfen
{
char c[4];
bool operator == (const shenfen &x) const
{
for (int i = 0;i < 4; ++i)
if (c[i] != x.c[i])return 0;
return 1;
}
}zg, zc, fz, sf[N];
short alive, n, m, now, ans, tl[N] = {0}, spl[N] = {0}, spr[N] = {0}, sps[N] = {0}, num[N][100], wu1, wu2;
char c1[4], sp[N][M] = {0}, pd[M] = {0};
bool tz[N] = {0}, tf[N] = {0}, lf[N] = {0}, zb[N] = {0}, zgs(0);
const char tao = 'P', sha = 'K', shan = 'D', jd = 'F', nan = 'N', wan = 'W', wu = 'J', zhu = 'Z';
inline void yongpai(int i, char pai)
{
if (pai == wu)
{
if (sf[i] == fz)wu2--;
else wu1--;
}
num[i][pai]--, sps[i]--;
while (sp[i][spl[i]] == 0 && spl[i] < spr[i])spl[i]++;
for (int k = spl[i];;++k)
if (sp[i][k] == pai)
{
sp[i][k] = 0;
break;
}
if (!sps[i])
spl[i] = spr[i] = 0;
}
inline int target_sha(int i)
{
int j, k;
if (i == 1)
{
for (j = i+1;j <= n; ++j)
if (tl[j])
{
if (lf[j] || tf[j])
return j;
return 0;
}
return 0;
}
if (sf[i] == zc)
{
for (j = i+1;j != i; ++j)
{
if (j > n)j = 1;
if (tl[j])
{
if (tf[j])
return j;
return 0;
}
}
return 0;
}
if (sf[i] == fz)
{
for (j = i+1;j != i; ++j)
{
if (j > n)j = 1;
if (tl[j])
{
if (j == 1 || tz[j])
return j;
return 0;
}
}
return 0;
}
}
inline int target_jd(int i)
{
int j, k;
if (i == 1)
{
for (j = i+1;j <= n; ++j)
if (tl[j] && (lf[j] || tf[j]))
return j;
return 0;
}
if (sf[i] == zc)
{
for (j = i+1;j != i; ++j)
{
if (j > n)j = 1;
if (tl[j] && tf[j])
return j;
}
return 0;
}
if (sf[i] == fz)
{
for (j = i+1;j != i; ++j)
{
if (j > n)j = 1;
if (tl[j] && tz[j])
return j;
}
return 0;
}
}
inline void mo(int x, int k)
{
if (js())return;
while (k--)
if (m)
{
if (pd[m] == wu)
{
if (sf[x] == fz)wu2++;
else wu1++;
}
sp[x][++spr[x]] = pd[m], num[x][pd[m]]++, sps[x]++, m -= (m > 1);
}
}
inline void yongtao(int i)
{
yongpai(i, tao), tl[i]++;
}
inline void diaoxie(int i)
{
tl[i]--;
if (!tl[i])
{
if (num[i][tao])
{
yongpai(i, tao);
tl[i]++;
}
else
{
if (i == 1)
zgs = 1;
if (sf[i] == fz)
alive--;
}
}
}
inline void yongshan(int i)
{
if (num[i][shan])
yongpai(i, shan);
else
diaoxie(i);
}
inline void zhushazhong()
{
memset(sp[1], 0, sizeof(sp[1]));
memset(num[1], 0, sizeof(num[1]));
sps[1] = spl[1] = spr[1] = zb[1] = 0;
}
inline void yongsha(int i, int j)
{
if (j == 1 || tz[j])tf[i] = 1;
if (tf[j] && i != 1)tz[i] = 1, lf[i] = 0;
if (num[i][sha])
{
yongpai(i, sha);
if (j)
{
yongshan(j);
if (!tl[j])
{
if (sf[j] == fz && alive)
mo(i, 3);
if (sf[j] == zc && i == 1)
zhushazhong();
}
}
}
}
inline void xunwenwuxie(int i)
{
if (sf[i] == fz && !wu1)return;
if (tz[i] && !wu2)return;
for (int j = i+1;; ++j)
{
if (j > n)j = 1;
if (j == i)break;
if (!tl[j])continue;
if (tf[i])
{
if ((sf[j] == zc || tz[j]) && num[j][wu])
{
yongpai(j, wu);
tz[j] = 1, lf[j] = 0;
ans ^= 1;
xunwenwuxie(j);
return;
}
}
if (tz[i] || i == 1)
{
if (sf[j] == fz && num[j][wu])
{
yongpai(j, wu);
tf[j] = 1;
ans ^= 1;
xunwenwuxie(j);
return;
}
}
}
}
inline void nanmanruqin(int i)
{
for (int j = i+1;j != i; ++j)
{
if (j > n)j = 1;
if (j == i || js())break;
if (!tl[j])continue;
ans = 1;
if (j == 1 || tz[j])
{
if ((tz[i] || sf[i] == zc) && num[i][wu])
{
ans ^= 1;
yongpai(i, wu);
tz[i] = 1, lf[i] = 0;
xunwenwuxie(i);
}
else
{
for (int k = i+1;k != i; ++k)
{
if (k > n)k = 1;
if (k == i)break;
if (!tl[k])continue;
if ((tz[k] || sf[k] == zc) && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tz[k] = 1, lf[k] = 0;
xunwenwuxie(k);
break;
}
}
}
}
else
if (tf[j])
{
if (sf[i] == fz && num[i][wu])
{
ans ^= 1;
yongpai(i, wu);
tf[i] = 1;
xunwenwuxie(i);
}
else
{
for (int k = i+1;k != i; ++k)
{
if (k > n)k = 1;
if (k == i)break;
if (!tl[k])continue;
if (sf[k] == fz && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tf[k] = 1;
xunwenwuxie(k);
break;
}
}
}
}
if (ans)
{
if (num[j][sha])
{
yongsha(j, 0);
}
else
{
diaoxie(j);
if (!tl[j])
{
if (sf[j] == zc && i == 1)
zhushazhong();
if (sf[j] == fz && alive)
mo(i, 3);
}
else
{
if (j == 1 && !tz[i] && !tf[i])
lf[i] = 1;
}
}
}
}
}
inline void wanjianqifa(int i)
{
for (int j = i+1;j != i; ++j)
{
if (j > n)j = 1;
if (j == i || js())break;
if (!tl[j])continue;
ans = 1;
if (j == 1 || tz[j])
{
if ((tz[i] || sf[i] == zc) && num[i][wu])
{
ans ^= 1;
yongpai(i, wu);
tz[i] = 1, lf[i] = 0;
xunwenwuxie(i);
}
else
{
for (int k = i+1;k != i; ++k)
{
if (k > n)k = 1;
if (k == i)break;
if (!tl[k])continue;
if ((tz[i] || sf[k] == zc) && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tz[k] = 1, lf[k] = 0;
xunwenwuxie(k);
break;
}
}
}
}
else
if (tf[j])
{
if (sf[i] == fz && num[i][wu])
{
ans ^= 1;
yongpai(i, wu);
tf[i] = 1;
xunwenwuxie(i);
}
else
{
for (int k = i+1;k != i; ++k)
{
if (k > n)k = 1;
if (k == i)break;
if (!tl[k])continue;
if (sf[k] == fz && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tf[k] = 1;
xunwenwuxie(k);
break;
}
}
}
}
if (ans)
{
if (num[j][shan])
{
yongshan(j);
}
else
{
diaoxie(j);
if (!tl[j])
{
if (sf[j] == zc && i == 1)
zhushazhong();
if (sf[j] == fz && alive)
mo(i, 3);
}
else
{
if (j == 1 && !tz[i] && !tf[i])
lf[i] = 1;
}
}
}
}
}
inline void juedou(int i, int j)
{
if (num[i][jd])
{
yongpai(i, jd);
if (i == 1)
{
if (tf[j])
{
ans = 1;
for (int k = 2;k <= n; ++k)
{
if (!tl[k])continue;
if (sf[k] == fz && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tf[k] = 1;
xunwenwuxie(k);
break;
}
}
if (!ans)
return;
}
if (sf[j] == fz)
{
if (!num[j][sha])
{
diaoxie(j);
if (!tl[j] && alive)
mo(i, 3);
return;
}
while (num[j][sha] && num[i][sha])
{
yongsha(j, 0);
yongsha(i, 0);
if (!num[j][sha])
{
diaoxie(j);
if (!tl[j] && alive)
mo(i, 3);
return;
}
if (!num[i][sha])
{
diaoxie(i);
return;
}
}
}
if (sf[j] == zc)
{
diaoxie(j);
if (!tl[j])
zhushazhong();
}
return;
}
else
{
if (sf[i] == zc)
{
tz[i] = 1, lf[i] = 0;
ans = 1;
for (int k = i+1;k != i; ++k)
{
if (k > n)k = 1;
if (k == i)break;
if (!tl[k])continue;
if (sf[k] == fz && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tf[k] = 1;
xunwenwuxie(k);
break;
}
}
if (!ans)
return;
}
if (sf[i] == fz)
{
tf[i] = 1;
ans = 1;
for (int k = i+1;k != i; ++k)
{
if (k > n)k = 1;
if (i == 1)break;
if (!tl[k])continue;
if ((sf[k] == zc || tz[k]) && num[k][wu])
{
ans ^= 1;
yongpai(k, wu);
tz[k] = 1, lf[k] = 0;
xunwenwuxie(k);
break;
}
}
if (!ans)
return;
}
if (!num[j][sha])
{
diaoxie(j);
if (!tl[j] && sf[j] == fz && alive)
mo(i, 3);
}
if (num[j][sha] && !num[i][sha])
{
yongsha(j, 0);
diaoxie(i);
if (!tl[i] && sf[i] == fz && alive)
mo(j, 3);
}
while (num[j][sha] && num[i][sha])
{
yongsha(j, 0);
yongsha(i, 0);
if (!num[j][sha])
{
diaoxie(j);
if (!tl[j] && sf[j] == fz && alive)
mo(i, 3);
continue;
}
if (!num[i][sha])
{
diaoxie(i);
if (!tl[i] && sf[i] == fz && alive)
mo(j, 3);
continue;
}
}
}
}
}
inline void chu(int i, int s1)
{
int j, k, u, s(0);
while (sp[i][spl[i]] == 0)spl[i]++;
for (u = spl[i];u <= spr[i]; ++u)
{
if (sp[i][u] == 0 || sp[i][u] == wu || sp[i][u] == shan)continue;
if (sp[i][u] == tao)
{
if (tl[i] < 4)
yongtao(i);
continue;
}
if (sp[i][u] == nan)
{
yongpai(i, nan);
nanmanruqin(i);
if(js())return;
if (sps[i])
{
chu(i, s+s1);
return;
}
continue;
}
if (sp[i][u] == wan)
{
yongpai(i, wan);
wanjianqifa(i);
if(js())return;
if (sps[i])
{
chu(i, s+s1);
return;
}
continue;
}
if (sp[i][u] == zhu)
{
zb[i] = 1;
yongpai(i, zhu);
if (num[i][sha])
{
if (sps[i])
{
chu(i, s+s1);
return;
}
}
continue;
}
if (sp[i][u] == sha)
{
if (!zb[i] && !s1 && !s)
{
j = target_sha(i);
if (j)
{
s = 1;
yongsha(i, j);
if(js())return;
}
continue;
}
if (zb[i])
{
j = target_sha(i);
if (j)
yongsha(i, j);
if(js())return;
continue;
}
}
if (sp[i][u] == jd)
{
if (sf[i] == fz)
j = 1;
else
j = target_jd(i);
if (j)
{
juedou(i, j);
if (!tl[i])return;
if(js())return;
if (sps[i])
{
chu(i, s+s1);
return;
}
}
continue;
}
}
}
int main()
{
int i, j, k, l;
zg.c[0] = 'M', zg.c[1] = 'P';
zc.c[0] = 'Z', zc.c[1] = 'P';
fz.c[0] = 'F', fz.c[1] = 'P';
scanf("%d %d ", &n, &m);
for (i = 1;i <= n; ++i)
{
scanf("%s", sf[i].c);
if (sf[i] == fz)
alive++;
tl[i] = spr[i] = sps[i] = 4;
spl[i] = 1;
for (j = 1;j <= 4; ++j)
{
scanf("%s", c1);
if (c1[0] == 'P'){now = tao, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'K'){now = sha, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'D'){now = shan, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'F'){now = jd, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'N'){now = nan, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'W'){now = wan, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'J'){now = wu, sp[i][j] = now, num[i][now]++;}
if (c1[0] == 'Z'){now = zhu, sp[i][j] = now, num[i][now]++;}
}
if (sf[i] == fz)wu2 += num[i][wu];
else wu1 += num[i][wu];
}
for (i = m;i >= 1; --i)
{
c1[0] = getchar();
while (c1[0] == ' ' || c1[0] == '\n')c1[0] = getchar();
if (c1[0] == 'P'){now = tao, pd[i] = now;}
if (c1[0] == 'K'){now = sha, pd[i] = now;}
if (c1[0] == 'D'){now = shan, pd[i] = now;}
if (c1[0] == 'F'){now = jd, pd[i] = now;}
if (c1[0] == 'N'){now = nan, pd[i] = now;}
if (c1[0] == 'W'){now = wan, pd[i] = now;}
if (c1[0] == 'J'){now = wu, pd[i] = now;}
if (c1[0] == 'Z'){now = zhu, pd[i] = now;}
}
tz[1] = 1;
for (i = 1;;i = (i == n) ? 1 : ++i)
{
if (js()){break;}
if (!tl[i]){continue;}
mo(i, 2);
if (!sps[i]){continue;}
chu(i, 0);
}
if(zgs)
puts("FP");
else
puts("MP");
for (i = 1;i <= n; ++i)
{
if (tl[i])
{
if (sps[i])
{
while (sp[i][spl[i]] == 0)spl[i]++;
putchar(sp[i][spl[i]]);
for (j = spl[i]+1;j <= spr[i]; ++j)
{
if (sp[i][j] == 0)
continue;
putchar(32), putchar(sp[i][j]);
}
}
if (i < n)
puts("");
}
else
if (i < n)
puts("DEAD");
else
printf("DEAD");
}
return 0;
}