时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
一年一度的浙江中医药大学程序设计校赛正在火热进行,举办至今这是第十一届校赛了。
那么今年就来寻找一下zcmu。
这里有一串只包含小写字母的字符串,里面有若干个zcmu,你为了省力,需要知道最少需要删除几个字符是的有连续四个字符是"zcmu"。
输入描述:
多组数据 每组数据包含一个字符串 1 <= n <= 100000
输出描述:
输出一个整数表示最少需要删除的字符数,若不存在则输出"-1"。
示例1
输入
zcmu umcz zzccmmuuaa
输出
0 -1 2
POINT:
给每个z存一个离他最近的(右边)的c。可以用o(n)的效率求出来。
每个c存m,m存u。
遍历一下这个类似链表的东西得出答案即可。
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#include <vector>
#include <map>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 100000+33;
#define LL long long
const int inf = 0x3f3f3f3f;
char s[maxn];
void doit(char a,char b,int temp[])
{
int l=strlen(s);
int now=-1;
for(int i=l-1;i>=0;i--){
if(s[i]==b){
now=i;
}
if(s[i]==a){
temp[i]=now;
}
}
return;
}
int main()
{
while(~scanf("%s",s)){
int l=strlen(s);
int z[maxn];
int c[maxn];
int m[maxn];
doit('z','c',z);
doit('c','m',c);
doit('m','u',m);
int ans=inf;
for(int i=0;i<l;i++){
if(s[i]=='z'){
int aa=z[i];
if(aa==-1) continue;
int bb=c[aa];
if(bb==-1) continue;
int cc=m[bb];
if(cc==-1) continue;
ans=min(ans,(cc-i+1)-4);
}
}
if(ans==inf){
printf("-1\n");
}else
printf("%d\n",ans);
}
}