总时间限制: 1000ms 内存限制: 65536kB
描述
有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。
例如,S = “abcd123ab888efghij45ef67kl”, S1=”ab”, S2=”ef”,其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。
- 输入
三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号和空格); - 输出
S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。 - 样例输入
abcd123ab888efghij45ef67kl,ab,ef - 样例输出
18
题解:
–这道看起来很简单的题,其实真的是小错误,大恶心(我都和它死磕到底了)
具体见注释,啦啦啦啦啦啦绿绿绿绿绿绿绿绿啦啦啦绿啦啦绿绿绿绿
代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN=305;
int l,l1,l2;
char s[MAXN],s1[MAXN],s2[MAXN];
int a,b; //分别是s1的右位置和s2的左位置
int main(){
char A;
A=getchar();
while(A!=','){
s[++l]=A;
A=getchar();
}
A=getchar();
while(A!=','){
s1[++l1]=A;
A=getchar();
}
A=getchar();
while(A!=EOF){ //这里,我开始用的是 A!='/n' 然后莫名TML
s2[++l2]=A;
A=getchar();
}
int k=1;
for(int i=1;i<=l;i++){
if(s[i]==s1[k])
k++;
else
k=1;
if(k==l1+1){
a=i;
break;
}
}
k=l2-1; //额,原来EOF也是算一个字符,然后被存在s2里面了....
for(int i=l;i>=1;i--){
if(s[i]==s2[k])
k--;
else
k=l2-1;
if(k==0){
b=i;
break;
}
}
if(a>=b)
cout<<-1<<endl;
else
cout<<b-a-1<<endl;
return 0;
}