# 玩坏第一题

### 思路：

#include <iostream>
#include <cstring>
#include <cstdio>

#define MX 1010

using namespace std;

int n,m;
int mat[MX][MX];
int fol[MX][MX];
int sum[MX][MX];

{
if(p==0)return;
for(int i=p;i<MX;i+=i&-i)
sum[t][i]+=x;
}

int qsm(int t,int p)
{
int x=0;
for(int i=p;i>=1;i-=i&-i)
x+=sum[t][i];
return x;
}

void input()
{
char ch;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ch=getchar();
while(ch!='0'&&ch!='1')ch=getchar();
mat[i][j]=ch-'0';
}
}
}

void work()
{
for(int i=1;i<=n;i++)
{
for(int j=m;j>=1;j--)
{
if(mat[i][j]==0)fol[i][j]=0;
else fol[i][j]=fol[i][j+1]+1;
}
}
int ans=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
ans=max(ans,i*(qsm(j,MX)-qsm(j,i-1)));
printf("%d\n",ans);

}

int main()
{
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
input();
work();
return 0;
}


# 卡坏第二题

### 思路：

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

#define MX 300003
#define LEN 700000

using namespace std;
typedef long long ll;

const int L=64;
int n,m;
int game[MX],son[MX],mxs;

class force1
{
public:
int get_ok(int pos)
{
ll now=pos/L;
ll mov=pos%L;
ll a1=0,b1=0,a2=0,b2=0,a3=0,b3=0,a4=0,b4=0;
if(a1||a2||a3||a4||b1||b2||b3||b4)return 1;
return 0;
}
void dp()
{
f[0]=1;
for(int i=1;i<=mxs;i++)
if(get_ok(i))f[i/L]|=(1LL<<(i%L));
int ans=0;
for(int i=1;i<=m;i++)if(f[son[i]/L]&(1LL<<(son[i]%L)))ans++;
cout<<ans<<endl;
}
}f1;

int main()
{
freopen("present.in","r",stdin);
freopen("present.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&game[i]);
for(int j=1;j<=m;j++)scanf("%d",&son[j]),mxs=max(mxs,son[j]);
f1.dp();
return 0;
}


#include <iostream>
#include <cstring>
#include <cstdio>

#define MX 300003

using namespace std;

int n,m,mod=99999999;
int p[MX],s[MX];

void input()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&p[i]),mod=min(mod,p[i]);
for(int j=1;j<=m;j++)scanf("%d",&s[j]);
}

int dis[MX],inq[MX],q[MX];
void spfa(int frm)
{
int h=0,t=1,nu,nv;
memset(dis,0x3f,sizeof(dis));
q[++h]=frm;
inq[frm]=1;
dis[frm]=0;
while(h>=t)
{
nu=q[t++];
for(int i=1;i<=n;i++)
{
nv=(nu+p[i])%mod;
if(dis[nu]+p[i]<dis[nv])
{
dis[nv]=dis[nu]+p[i];
if(!inq[nv])
{
q[++h]=nv;
inq[nv]=1;
}
}
}
inq[nu]=0;
}
}

int main()
{
freopen("present.in","r",stdin);
freopen("present.out","w",stdout);
input();
spfa(0);
int ans=0;
for(int i=1;i<=m;i++)
if(dis[s[i]%mod]<=s[i])ans++;
cout<<ans<<endl;
return 0;
}


# 裱坏第三题

1c~7c 表示。

1m 1m 或 7c 7c)。

### 思路：

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

typedef struct mag
{
int s[20];
int p[20];
int c[20];
int m[20];
}mahj;

mahj ting;

bool gsws(mahj a)
{
if(a.m[1]==1&&a.m[9]==1&&a.s[1]==1&&a.s[9]==1&&a.p[1]==1&&a.p[9]==1&&a.c[1]==1&&a.c[2]==1&&a.c[3]==1&&a.c[4]==1&&a.c[5]==1&&a.c[6]==1&&a.c[7]==1)
{
cout<<13<<" "<<"1m 9m 1s 9s 1p 9p 1c 2c 3c 4c 5c 6c 7c"<<endl;
return 1;
}
return 0;
}

bool gsws2(mahj a)
{
if(a.m[1]>=1&&a.m[9]>=1&&a.s[1]>=1&&a.s[9]>=1&&a.p[1]>=1&&a.p[9]>=1&&a.c[1]>=1&&a.c[2]>=1&&a.c[3]>=1&&a.c[4]>=1&&a.c[5]>=1&&a.c[6]>=1&&a.c[7]>=1)
{
return 1;
}
return 0;
}

bool qdz(mahj a)
{
int cnt=0;
for(int i=1;i<=9;i++)if(a.m[i]==2)cnt++;
for(int i=1;i<=9;i++)if(a.s[i]==2)cnt++;
for(int i=1;i<=9;i++)if(a.p[i]==2)cnt++;
for(int i=1;i<=7;i++)if(a.c[i]==2)cnt++;
if(cnt==7)return 1;
return 0;
}

bool checksm(mahj a)
{
int ok=0;
for(int i=1;i<=9;i++)
if(a.m[i]>=3)a.m[i]-=3,ok++;
for(int i=1;i<=9;i++)
if(a.s[i]>=3)a.s[i]-=3,ok++;
for(int i=1;i<=9;i++)
if(a.p[i]>=3)a.p[i]-=3,ok++;
for(int i=1;i<=7;i++)
if(a.c[i]>=3)a.c[i]-=3,ok++;
for(int i=1;i<=7;i++)
while(a.m[i]&&a.m[i+1]&&a.m[i+2])
a.m[i]--,a.m[i+1]--,a.m[i+2]--,ok++;
for(int i=1;i<=7;i++)
while(a.s[i]&&a.s[i+1]&&a.s[i+2])
a.s[i]--,a.s[i+1]--,a.s[i+2]--,ok++;
for(int i=1;i<=7;i++)
while(a.p[i]&&a.p[i+1]&&a.p[i+2])
a.p[i]--,a.p[i+1]--,a.p[i+2]--,ok++;
if(ok>=4)return 1;
return 0;
}

bool checkshun(mahj a)
{
//cout<<a.m[4]<<endl;
int ok=0;
for(int i=1;i<=7;i++)
while(a.m[i]&&a.m[i+1]&&a.m[i+2])
a.m[i]--,a.m[i+1]--,a.m[i+2]--,ok++;
for(int i=1;i<=7;i++)
while(a.s[i]&&a.s[i+1]&&a.s[i+2])
a.s[i]--,a.s[i+1]--,a.s[i+2]--,ok++;
for(int i=1;i<=7;i++)
while(a.p[i]&&a.p[i+1]&&a.p[i+2])
a.p[i]--,a.p[i+1]--,a.p[i+2]--,ok++;
for(int i=1;i<=9;i++)
if(a.m[i]>=3)a.m[i]-=3,ok++;
for(int i=1;i<=9;i++)
if(a.s[i]>=3)a.s[i]-=3,ok++;
for(int i=1;i<=9;i++)
if(a.p[i]>=3)a.p[i]-=3,ok++;
for(int i=1;i<=7;i++)
if(a.c[i]>=3)a.c[i]-=3,ok++;
if(ok>=4)return 1;
return 0;
}

bool checkni(mahj a)
{
int ok=0;
for(int i=7;i>=1;i--)
while(a.m[i]&&a.m[i+1]&&a.m[i+2])
a.m[i]--,a.m[i+1]--,a.m[i+2]--,ok++;
for(int i=7;i>=1;i--)
while(a.s[i]&&a.s[i+1]&&a.s[i+2])
a.s[i]--,a.s[i+1]--,a.s[i+2]--,ok++;
for(int i=7;i>=1;i--)
while(a.p[i]&&a.p[i+1]&&a.p[i+2])
a.p[i]--,a.p[i+1]--,a.p[i+2]--,ok++;
for(int i=1;i<=9;i++)
if(a.m[i]>=3)a.m[i]-=3,ok++;
for(int i=1;i<=9;i++)
if(a.s[i]>=3)a.s[i]-=3,ok++;
for(int i=1;i<=9;i++)
if(a.p[i]>=3)a.p[i]-=3,ok++;
for(int i=1;i<=7;i++)
if(a.c[i]>=3)a.c[i]-=3,ok++;
if(ok>=4)return 1;
return 0;
}

bool sm(mahj a)
{
mahj c;
for(int i=1;i<=9;i++)
{
if(a.m[i]>=2)
{
c=a;
c.m[i]-=2;
if(checksm(c)||checkshun(c)||checkni(c))return 1;
}
}
for(int i=1;i<=9;i++)
{
if(a.s[i]>=2)
{
c=a;
c.s[i]-=2;
if(checksm(c)||checkshun(c)||checkni(c))return 1;
}
}
for(int i=1;i<=9;i++)
{
if(a.p[i]>=2)
{
c=a;
c.p[i]-=2;
if(checksm(c)||checkshun(c)||checkni(c))return 1;
}
}
for(int i=1;i<=7;i++)
{
if(a.c[i]>=2)
{
c=a;
c.c[i]-=2;
if(checksm(c)||checkshun(c)||checkni(c))return 1;
}
}
return 0;
}

void input()
{
char nam;
int num;
memset(&ting,0,sizeof(ting));
for(int i=1;i<=13;i++)
{
scanf("%d",&num);
nam=getchar();
while(nam!='s'&&nam!='m'&&nam!='p'&&nam!='c')nam=getchar();
}
}

void output()
{
int cnt=0;
for(int i=1;i<=9;i++)if(ting.m[i])cnt++;
for(int i=1;i<=9;i++)if(ting.s[i])cnt++;
for(int i=1;i<=9;i++)if(ting.p[i])cnt++;
for(int i=1;i<=7;i++)if(ting.c[i])cnt++;
if(cnt==0){cout<<"Nooten"<<endl;return;}
cout<<cnt<<" ";
for(int i=1;i<=9;i++)if(ting.m[i])cout<<i<<"m ";
for(int i=1;i<=9;i++)if(ting.s[i])cout<<i<<"s ";
for(int i=1;i<=9;i++)if(ting.p[i])cout<<i<<"p ";
for(int i=1;i<=7;i++)if(ting.c[i])cout<<i<<"c ";
cout<<endl;
}

void work()
{
mahj a;
for(int i=1;i<=9;i++)
{
{
a.m[i]++;
if(qdz(a)||sm(a)||gsws2(a))ting.m[i]++;
}
{
a.s[i]++;
if(qdz(a)||sm(a)||gsws2(a))ting.s[i]++;
}
{
a.p[i]++;
if(qdz(a)||sm(a)||gsws2(a))ting.p[i]++;
}
{
a.c[i]++;
if(qdz(a)||sm(a)||gsws2(a))ting.c[i]++;
}
}
output();
}

int main()
{
freopen("mahjong.in","r",stdin);
freopen("mahjong.out","w",stdout);
int t;
scanf("%d",&t);
for(int w=1;w<=t;w++)
{
input();
work();
}
return 0;
}