\(\\\)

\(Description\)


在一个只有\(W,I,N,G\)的字符集中,给出四个字符的若干映射,每个映射为一个字符映射到两个字符,现给你一个假定由一个字符经过多次映射产生的字符串,问将其还原成一个字符,可以还原成四类字符的哪几个。

  • 每个字符的映射集合大小不超过\(16\),给出的映射后字符串长度不超过\(200\)

\(\\\)

\(Solution\)


  • 注意到每次是两个字符合成一个字符,不妨考虑每一个字符合成的过程。

  • 可达性\(DP\)。设\(f[i][j][k]=0/1\)表示闭区间\([i,j]\)能否合成一个字符\(k\),显然边界有\(f[i][i][num[i]]=1\)

  • 转移就是基本的区间\(DP\)的形式,枚举长度,端点,检查左右两端能否合并即可。

基本形式知道了做题还是不会往题上套 看来姿势还是要速度涨起来

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 210
#define R register
#define gc getchar
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} char s[N];
bool f[N][N][4];
int n[4],tot,num[N],trs[4][20][2]; inline int fuc(char x){
return (x=='W'?0:(x=='I'?1:(x=='N'?2:3)));
} int main(){
for(R int i=0;i<=3;++i) n[i]=rd();
char c=gc();
for(R int i=0;i<=3;++i)
for(R int j=1;j<=n[i];++j){
while(!isupper(c)) c=gc();
trs[i][j][0]=fuc(c);
trs[i][j][1]=fuc(gc()); c=gc();
}
while(!isupper(c)) c=gc();
num[1]=fuc(c);
scanf("%s",s);
int slen=strlen(s);
for(R int i=0;i<slen;++i) num[tot=(2+i)]=fuc(s[i]);
for(R int i=1;i<=tot;++i) f[i][i][num[i]]=1;
for(R int len=1;len<=tot;++len)
for(R int l=1,r;l<=tot-len+1;++l){
r=l+len-1;
for(R int k=l;k<r;++k)
for(R int i=0;i<=3;++i)
for(R int j=1;j<=n[i];++j)
f[l][r][i]|=f[l][k][trs[i][j][0]]&&f[k+1][r][trs[i][j][1]];
}
bool fl=0;
for(R int i=0;i<=3;++i) if(f[1][tot][i])fl=1;
if(!fl){puts("The name is wrong!");return 0;}
if(f[1][tot][0]) printf("W");
if(f[1][tot][1]) printf("I");
if(f[1][tot][2]) printf("N");
if(f[1][tot][3]) printf("G");
return 0;
}

最新文章

  1. codevs 3110 二叉堆练习3
  2. codeforces 711D Directed Roads(DFS)
  3. 【wikioi】1033 蚯蚓的游戏问题(费用流)
  4. php内容
  5. linux 显示当前用户信息
  6. SQL 2008 R2 启动失败 提示 请求失败或服务未及时响应
  7. cocoa pods 安装 转载
  8. 关于meta定义 和 link
  9. HK共享吧解压密码
  10. mongoDB4--mongoDB的增删改查
  11. linux脚本Shell之九九乘法表
  12. JavaScript设计模式_05_发布订阅模式
  13. 自定义php错误异常处理
  14. asp.net-基础-20180319
  15. 02Spring Boot配置文件详解
  16. spark面试总结3
  17. C#生成唯一订单号
  18. 利用channel在goroutins之间控制同步和传递数据
  19. StreamSets学习系列之StreamSets的Create New Pipeline(图文详解)
  20. cmd--登录mysql

热门文章

  1. 小数化分数的O(log2n)解法
  2. URAL 1108 简单的树形dp背包问题
  3. R - Milking Time DP
  4. [poj2425]A Chess Game_博弈论
  5. 洛谷 P1991 无线通讯网
  6. 1048 石子归并codevs
  7. Angularjs中添加HighCharts
  8. logout退出功能是怎么实现的?login登陆功能室怎么实现的
  9. HDU 5358 多校第6场 First One
  10. 【转】获取Android控件的宽和高