2013: 寻找zcmu
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 466 Solved: 75
[ Submit][ Status][ Web Board]
Description
Input
多组数据
每组数据包含一个字符串
1 <= n <= 100000
Output
输出一个整数表示最少需要删除的字符数,若不存在则输出"-1"。
Sample Input
zcmu
umcz
zzccmmuuaa
Sample Output
0
-1
2
题解:
找出所有z的位置,有几个z就枚举几次,每次枚举借用upper_bound算法,返回指向第一个大于z位置的迭代器,若没有则返回指向最后一个位置加+1的迭代器
遍历的时候要用ans[i],不然超时,可能是strlen时间耗时长,要用ans[i]
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define inf 100010
const
int
INF = 0x3f3f3f3f;
using
namespace
std;
vector<
int
>z, c, m, u;
int
numz, numc, numm, numu;
int
main()
{
char
ans[inf];
int
i;
while
( ~
scanf
(
"%s"
, ans)){
for
(i = 0; ans[i] ; i++) {
if
(ans[i] ==
'z'
) z.push_back(i);
if
(ans[i] ==
'c'
) c.push_back(i);
if
(ans[i] ==
'm'
) m.push_back(i);
if
(ans[i] ==
'u'
) u.push_back(i);
}
int
an = INF;
bool
flag =
false
;
for
(
int
i = 0; i < (
int
)z.size(); i++) {
int
p1 = upper_bound(c.begin(),c.end(),z[i]) - c.begin();
if
(p1 == c.size())
break
;
int
p2 = upper_bound(m.begin(),m.end(),c[p1]) - m.begin();
if
(p2 == m.size())
break
;
int
p3 = upper_bound(u.begin(),u.end(),m[p2]) - u.begin();
if
(p3 == u.size())
break
;
flag = 1;
//cout<<"p1 = "<<p1<<"p2 = "<<p2<<"p3 = "<<p3<<endl;
if
(an > u[p3] - z[i] - 3)
an = u[p3] - z[i] - 3;
}
printf
(
"%d\n"
, flag ? an : -1);
z.clear();
c.clear();
u.clear();
m.clear();
}
return
0;
}