QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#64091 | #4666. Delete And Win | BMTXLRC | WA | 2ms | 3404kb | C++14 | 2.5kb | 2022-11-24 08:36:39 | 2022-11-24 08:36:43 |
Judging History
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;
}
for(int i=2;i<=n;i++){
now++;
if(t[now]<s[i]){
cout<<shan;
return 0;
}
if(t[now]==s[i]) 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<<shan;
return 0;
}
if(t[now+1]==s[i]){
now++;
continue ;
}
}
if(ck==1) now++;
while(1){
if(t[now]<=s[i]) break;
now++;
shan++;
}
if(t[now]<s[i]||(t[now+1]<s[i+1]&&i!=n)){
cout<<shan;
return 0;
}
if(t[now]<s[i-1]){
cout<<shan+1;
return 0;
}
}
cout<<shan+(m-now+1);
}
/*hyddakioi
whywillaknoi
whqwillsingatninepm
dajiabujianbusan
ahhhhhhhhhhhhhhflowerletterishuahua
heisanoierinhighschoolaffiliatedtorenminuniversityofchina
*/
详细
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 3404kb
input:
pqsrpspqz pqrpqz
output:
0
result:
wrong answer 1st numbers differ - expected: '2', found: '0'