【WZOI第二次NOIP模拟赛Day1T1】神秘大门 解题报告

【WZOI第二次NOIP模拟赛Day1T1】神秘大门 

Problem 1 神秘大门 (door.pas/c/cpp) 


背景
WZland最近成立了一个OI应急小组,简称WZOI。WZOI挑选了WZland精英,他共同处理WZland中发生的重大事件…… 


问题描述
        最近WZOI的CWQ大牛经过调查发现,在WZland的最南方——WZ Antarctica出现了奇怪的磁场反应。为了弄清楚这一现象,CWQ大牛亲自出马,来到了WZ Antarctica。
        CWQ大牛发现WZ Antarctica出现了一道神秘的大门。人总有好奇心,CWQ大牛想打开这扇神秘大门,看门的后面究竟是什么东西,但用尽什么办法也不能打开这扇门。突然,门上出现了一些奇怪的字符。凭着敏锐的直觉,CWQ认为这些符号就是打开这扇门的关键,于是CWQ抓紧时间开始研究这些符号。
        经过一些时间的研究,CWQ大牛发现这些符号其实是一串密码,只有破解了这个密码,才能打开那扇神秘大门。这个密码十分简单,他给出了两个很长的字符串A和B,你只需要判断B是否在A中出现过就可以了,当然如果B在A中出现,那么你还需要输出B的字符在A中依次出现的位置。
        这里解释一下B在A中出现的概念,设A=S1S2…SN,B= T1T2…TM,如果存在一组数K:K1<K2<…<KM,使得B=SK1SK2…SKM,那么就可以认为B在A出现过。比如说A=sdfesad,B=sfsad,那么B在A中出现过,因为B中的字符在A中依次出现的位置为1 3 5 6 7。
        这个解密过程实在太简单了,于是CWQ大牛就将这个任务交给了WZOI的你。由于CWQ大牛十分着急,他只给了你1s的时间。


输入格式
输入数据包含2行,分别包含一个字符串,第一行输入的是字符串A,第二行输入的是字符串B。


输出格式
第一行输出一个字符串“Yes”或“No”,如果B在A中出现,那么输出“Yes”,否则输出“No”。
如果你的第一行输出“Yes”,那么在第接下来若干行你需要输出一组数K,使得B=SK1SK2…SKM,每行一个数;否则第二行为空。如果存在多组数据满足条件,你需要输出字典序最大的一组。


样例输入输出
Sample #1 
door.in  door.out 
sdfesad 
sfsad 
Yes 





Sample #2 
door.in  door.out 
abcdef 
acdefg 
No 


数据规模
对于30%的数据,串A的长度不超过10^3,串B的长度不超过10^3;
对于50%的数据,串A的长度不超过10^4,串B的长度不超过10^4;
对于100%的数据,串A的长度不超过10^6,串B的长度不超过10^6;
字符串只会由’A’..’Z’,’a’..’z’,’0’..’9’组成。


时间限制
1s 


提示
关于字典序:
比较两个数组S1[N]与S2[N]的字典序大小,可以找到S1[N]与S2[N]中第1个不相同数字S1[i]
与S2[i](即有对于所有1≤k<i,都有S1[k] =S2[k],但S1[i]≠S2[i])。如果S1[i]<S2[i],
那么说S1[N]字典序比S2[N]小,否则说S1[N]字典序比S2[N]大。 


【解题思路】

其实这道题的思路很简单,就只需要一边while循环就Ok;

因为要求字典序最大,所以应该从后往前扫一遍;设两个指针,一个指A一个指B,从后往前扫,如果A[i]==B[j]那么i--,j--,否则就只i--;

这样最后判断一下j是否==-1就可以解决了;

写完了之后才发现自己都不知道写了什么。。。只可意会不可言传自己理解吧->_->

【代码】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char na[1000005],nb[1000005];
int la,lb,i,j,num,ans[1000005],k;

int main()
{
	freopen("door.in","r",stdin);
	freopen("door.out","w",stdout);
	gets(na);
	gets(nb);
	la=strlen(na);
	lb=strlen(nb);
	if (la<lb)
	{
		printf("No");
		return 0;
	}
	i=la-1;
	j=lb-1;
	while (i>=0&&j>=0)
	{
		if (na[i]==nb[j])
		{
			j--;
			num++;
			ans[num]=i+1;
		}
		i--;
	}
	if (j==-1) 
	{
		printf("Yes\n");
		for (k=num;k>=1;--k)
		  printf("%d\n",ans[k]);
	}
	else  printf("No");
	return 0;
}
【并没有犯什么错误】

秒过~~然而hxy好像把Yes和No都打成了大写,,,no zuo no die<-_<-QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值