寻找ZCMU

来源:互联网 发布:历史周期律 知乎 编辑:程序博客网 时间:2024/05/22 03:35
不忘初心,砥砺前行!

2013: 寻找zcmu

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 484  Solved: 80
[Submit][Status][Web Board]

Description

Input

 多组数据  
每组数据包含一个字符串

 1 <= n <= 100000

Output

 输出一个整数表示最少需要删除的字符数,若不存在则输出"-1"。

Sample Input

zcmu
umcz
zzccmmuuaa

Sample Output

0
-1
2

HINT

【题解】:

哎,刚开始一直用find()找,结果超时了,回来看题解upper_bound()二分查找

开始预处理还是要把zcmu的下标用四个数组分别存就好处理了,upper_bound()找大于val值的第一个;

这题基本了


大佬的代码,自己看完了,敲了一遍

#include<cstdio>#include<algorithm>#include<iostream>#include<vector>using namespace std;#define clr clear()#define pd push_backconst int Max=0x3f3f3f3f;vector<int>z,c,m,u;int main(){    char a[100100];    while(~scanf("%s",a))    {        z.clr;c.clr;m.clr;u.clr;        for(int i=0;a[i];i++){            if(a[i]=='z')z.pd(i);            if(a[i]=='c')c.pd(i);            if(a[i]=='m')m.pd(i);            if(a[i]=='u')u.pd(i);        }        int flag=0,Min=Max;        for(int i=0;i<z.size();i++)        {            int p1=upper_bound(c.begin(),c.end(),z[i])-c.begin();            if(p1==c.size()) continue;            int p2=upper_bound(m.begin(),m.end(),c[p1])-m.begin();            if(p2==m.size()) continue;            int p3=upper_bound(u.begin(),u.end(),m[p2])-u.begin();            if(p3==u.size()) continue;            flag=1;            Min=min(Min,u[p3]-z[i]-3);        }        printf("%d\n",flag==1?Min:-1);    }    return 0;}