DTOJ#5201. 太空漫步

传送门

Do not go gentle into that good night.

Old age should burn and rave at close of day.

Rage Rage against the dying light.

不要温和地走进那个良夜。

白昼将尽,暮年仍应燃烧咆哮

怒斥吧——怒斥光的消逝。

Ame 是一位生活在 2078 年的女孩子。在她 16 岁时,她参加了 SpaceN 公司举行的知识竞赛并得到了特等奖,由此进入了 Space Explorer Program,Ame 由此获得了太空旅行的机会。我们的故事从这场太空旅行拉开。

​ 这场旅行除了 Ame 外共有 n n n 位乘客,每位乘客都到飞船外尝试了太空漫步。太空没有重力的限制,因此每位乘客都可以自由地在三维空间中移动(使用 SpaceN 公司研发的 Space Jet 装置)——但在 Ame 眼中他们是在一个(投影的)二维空间移动。Ame 用一个只由 N ‾ \underline{N} N(北)、 S ‾ \underline{S} S(南)、 E ‾ \underline{E} E(东)和 W ‾ \underline{W} W(西)构成的非空字符串 s i s_i si 来描述第 i i i 个乘客的移动轨迹(Ame 称之为轨迹串)。乘客每一单位时间移动一步,也就是说第 i i i 个乘客一共太空漫步了 $ \left|s_i\right|$ 单位时间。

​ Ame 又想出了一个固定的模式串,这个模式串由 $ \underline{NSEW*?[]} $ 构成,意义为:

  • ∗ ‾ \underline{*} :代表一个任意不定长度的可空串。
  • ? ‾ \underline{?} ?:代表一个不定的动作($ \underline{NSEW}$)。
  • [ A ] ‾ \underline{[A]} [A]:代表 $ \underline{A} $ 可以出现也可以不出现,其中 A ‾ \underline{A} A 也是一个模式串。
  • $ \underline{NSEW} $:代表对应动作。

​ 如果这个模式串能够匹配一个轨迹串,那么称这个轨迹是优美的。例如,当模式串是 N S ∗ E ‾ \underline{NS*E} NSE,那么 N S W E ‾ \underline{NSWE} NSWE N S E ‾ \underline{NSE} NSE 都是优美的 N S E W ‾ \underline{NSEW} NSEW 则不是。

​ 现在 Ame 想要问你,对于每一个乘客,各个时刻为止他走出的轨迹是不是优美的

输入共 n + 2 n+2 n+2 行。

第一行一个字符串,表示 Ame 想的模式串。

第二行一个正整数 n n n,代表除 Ame 外乘客的数量。

接下来 n n n 行,第 i i i 行给出第 i i i 个乘客的轨迹串 s i s_i si

输出共 n n n 行,第 i i i 行给出一个长度为 ∣ s i ∣ \left| s_i \right| si 的由 01 ‾ \underline{01} 01 构成的字符串。该字符串的第 j j j 位( 1 ≤ j ≤ ∣ s i ∣ 1\le j\le\left|s_i\right| 1jsi)代表第 i i i 个乘客在前 j j j 个单位时间走出的轨迹是不是优美的 0 ‾ \underline{0} 0 代表不是优美的 1 ‾ \underline{1} 1 代表是优美的),即, s i s_i si 的前 j j j 位前缀是不是优美的

样例输入 1
N[E]W
2
NW
NEW
样例输出 1
01
001
样例输入 2
?E
2
SE
WE
样例输出 2
01
01
样例输入 3
N*E
2
NE
NWEWEWSSSE
样例输出 3
01
0010100001
样例输入 4
?W[W[E]E]ES
3
SWWEEES
SWWEES
SWES
样例输出 4
0000001
000001
0001

约定 ∗ ? [ ] ‾ \underline{*?[]} ?[] 为特殊字符。

对于所有测试点,满足 n ≤ 100 n\le100 n100,模式串非空且长度小于等于 100 100 100 ∣ s i ∣ > 0 \left|s_i\right|>0 si>0 ∑ i = 1 n ∣ s i ∣ ≤ 1 0 6 \sum_{i=1}^{n}\left|s_i\right|\le10^6 i=1nsi106。保证模式串是合法的,没有相邻的特殊字符,且 [ ‾ \underline{[} [ ] ‾ \underline{]} ] 总是两两配对的。

每个子任务的具体限制见下表:

子任务编号分值可能含有的特殊字符特殊限制
12
28 ? ‾ \underline{?} ?A
320 ∗ ? ‾ \underline{*?} ?B
420 [   ] ‾ \underline{[ \ ]} [ ]C
520 ∗ ‾ \underline{*} D
628 ∗ ? [   ] ‾ \underline{*?[ \ ]} ?[ ]
72 ∗ ? [   ] ‾ \underline{*?[ \ ]} ?[ ]

特殊限制 A:模式串中最多只会出现一个 ∗ ‾ \underline{*}

特殊限制 B:模式串长度小于等于 10 10 10 ∑ i = 1 n ∣ s i ∣ ≤ 1 0 4 \sum_{i=1}^n\left|s_i\right|\le 10^4 i=1nsi104 [ ] ‾ \underline{[]} [] 中出现的是一个轨迹串,即 [ ] ‾ \underline{[]} [] 不会嵌套。

特殊限制 C:模式串中最多会出现 10 10 10 ∗ ‾ \underline{*}

特殊限制 D:模式串与所有乘客的轨迹串在所有可能的合法字符串中随机生成。

成都七中 noip2020模拟

考虑 D P DP DP,跟 l c s lcs lcs 基本一样,不过初始状态要预处理。(毒瘤)

#include<bits/stdc++.h>
using namespace std;
char s[105],str[1000005];
int pre[105];
int f[1000006][105];
int sta[105],top;
int main(){
	scanf("%s",1+s);
	int len=strlen(1+s);
	for(int i=1;i<=len;++i){
		if(s[i]=='['){
			sta[++top]=i;
		}
		if(s[i]==']'){
			pre[i]=sta[top--];
		}
	}
	int n;scanf("%d",&n);
	f[0][0]=1;
	for(int i=1;i<=len;++i){
		if(s[i]=='[')f[0][i]|=f[0][i-1];
		if(s[i]==']')f[0][i]|=f[0][pre[i]-1];
		if(s[i]=='*')f[0][i]|=f[0][i-1];
	}
	while(n--){
		scanf("%s",1+str);
		int nlen=strlen(1+str);
		for(int i=1;i<=nlen;++i){
			for(int j=1;j<=len;++j){
				f[i][j]=0;
				if(s[j]=='*')f[i][j]|=f[i-1][j]|f[i][j-1]|f[i-1][j-1];
				if(s[j]=='?')f[i][j]|=f[i-1][j-1];
				if(s[j]=='[')f[i][j]|=f[i][j-1];
				if(s[j]==']')f[i][j]|=f[i][pre[j]-1]|f[i][j-1];
				if(s[j]==str[i])f[i][j]|=f[i-1][j-1];
			}
			putchar(f[i][len]?'1':'0');
		}
		putchar('\n');
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值