传送门:BZOJ1055
傻逼题,然而我居然连状态定义都没有想出来。
记f(i,j,k)表示[i,j]的字符能否由k字符扩展来,转移就是怎么暴力怎么来
我觉得我要摆脱题解依赖了……必须摆脱!
代码上的小细节见下。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
struct Node{
int l[18];
int r[18];
int size;
};
Node num[5];
const char p[5]={‘a‘,‘W‘,‘I‘,‘N‘,‘G‘};
bool used[200][200][5];
bool f[200][200][5];
char c[205];
bool Dp(int l,int r,int k)
{
if(l==r)
return c[l]==p[k];
if(used[l][r][k])
return f[l][r][k];
used[l][r][k]=true;
for(int i=1;i<=num[k].size;i++)
for(int j=l;j<r;j++)
if(Dp(l,j,num[k].l[i])&&Dp(j+1,r,num[k].r[i]))
return f[l][r][k]=true;
return f[l][r][k]=false;
}
void Readdata()
{
freopen("loli.in","r",stdin);
for(int i=1;i<=4;i++)
scanf("%d",&num[i].size);
scanf("\n");
for(int i=1;i<=4;i++)
for(int j=1;j<=num[i].size;j++){
char a,b;
scanf("%c%c\n",&a,&b);
for(int k=1;k<=4;k++){
if(p[k]==a)
num[i].l[j]=k;
if(p[k]==b)
num[i].r[j]=k;
}
}
scanf("%s",c+1);
}
void Solve()
{
bool flag=false;
for(int i=1;i<=4;i++)
if(Dp(1,strlen(c+1),i)){
printf("%c",p[i]);
flag=true;
}
if(!flag)
printf("The name is wrong!");
}
void Close()
{
fclose(stdin);
fclose(stdout);
}
int main()
{
Readdata();
Solve();
Close();
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 09:30:50