QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#64109#4666. Delete And WinBMTXLRCWA 0ms3256kbC++142.8kb2022-11-24 09:05:522022-11-24 09:05:55

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-11-24 09:05:55]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3256kb
  • [2022-11-24 09:05:52]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
/*对于前面t的字符来说,我们要把他们删除到至少与s开头相等,此时若小于直接输出即可,
若相等,考虑第二个字符,
此时有相等,大于,小于的情况,小于直接就有解了,等于先考虑下一个
若大于,发现其实现在删去前面任意一个字符对他造成的影响相同(对任意非开头字符适用) 
所以此时我们可以一直删去对标s的上一个字符的t的字符,直到我们发现不能删了,也就是说再删一个字符
会导致前面的字符反而小了,或当前字符已经相等了之类的,注意只有相等才继续往后,假如是一类情况,
我们继续从当前,往后删就是了,否则直接输出答案,
每次达到一种可行条件后,我们都要判断是否删了前面一个字符后就直接ok了,当然如果不行的话就直接往后就行
最后假如都相等的话,直接删最后一个就行了,正确性在于我们不知道对于一种情况来说,当前全部相等,有没有可能说
删掉了若干个前面的字符后我们可以直接让他小于,感性理解一下,是不可能的。 
时间复杂度O(|s|+|t|) ,用一个指针记录t的匹配位置 
*/
char s[100004],t[100004];
int shan=0;
int main(){
//	freopen("string.in","r",stdin);
//	freopen("string.out","w",stdout);
	scanf("%s",s+1);
	scanf("%s",t+1); 
	int n=strlen(s+1),m=strlen(t+1);
	t[m+1]=' ';
	int now=1;
	while(1){
		if(t[now]<=s[1]) break;
		now++;
		shan++;
	}
	if(t[now]<s[1]){
		cout<<shan;
		return 0;
	}
	int zhan=100000004;
	for(int i=2;i<=n;i++){
		now++;
		if(t[now]<s[i]){
			cout<<shan;
			return 0;
		}
		if(t[now]==s[i]){
			if(t[now]<s[i-1]) zhan=min(shan+1,zhan);
			continue ;
		}
		int f=1,ck=0;
		if(s[i-1]>=t[now]){
			ck=1;
			while(1){
				if(s[i-1]>t[now]){//删t的前一个字符 
					shan++;
					f=0;
					break; 
				}
				if(s[i-1]==t[now]){
					shan++;
					if(t[now+1]<=s[i]) break;
				}
				if(s[i-1]<t[now+1]) break;
				now++;
			}
			if(f==0||t[now+1]<s[i]){
				cout<<min(shan,zhan);
				return 0;
			}
			if(t[now+1]==s[i]){
				now++;
				if(t[now]<s[i-1]){
					cout<<min(shan+1,zhan);
					return 0;
				}
				continue ;
			}
		}
		if(ck==1) now++;
		while(1){
			if(t[now]<=s[i]) break;
			if(t[now]<s[i-1]){
				cout<<min(shan+1,zhan);
				return 0;
			}
			now++;
			shan++;
		}
		if(t[now]<s[i]||(t[now+1]<s[i+1]&&i!=n)){
			cout<<min(shan,zhan);
			return 0;
		}
		if(t[now]<s[i-1]){
			cout<<min(shan+1,zhan);
			return 0;
		}
	}
	while(1){
		if(s[n]>t[now]) break;
		now++;
		shan++;
	}
	cout<<min(zhan,shan);
}
/*hyddakioi
whywillaknoi

whqwillsingatninepm
dajiabujianbusan

ahhhhhhhhhhhhhhflowerletterishuahua
heisanoierinhighschoolaffiliatedtorenminuniversityofchina
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3256kb

input:

pqsrpspqz
pqrpqz

output:

0

result:

wrong answer 1st numbers differ - expected: '2', found: '0'