您的位置:首页 > 其它

寻找zcmu-2017浙江中医药大学程序设计

2017-12-22 11:28 357 查看
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld


题目描述

一年一度的浙江中医药大学程序设计校赛正在火热进行,举办至今这是第十一届校赛了。
那么今年就来寻找一下zcmu。
这里有一串只包含小写字母的字符串,里面有若干个zcmu,你为了省力,需要知道最少需要删除几个字符是的有连续四个字符是"zcmu"。

输入描述:

多组数据
每组数据包含一个字符串
1 <= n <= 100000

输出描述:

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


示例1

输入

zcmu
umcz
zzccmmuuaa


输出

0
-1
2


只需要找到最后面的z和最前面的u,并且z和u之间存在c和m即可,用pre数组记录最后匹配字符的下标,然后滚动dp数组就行了。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define max 0x3f3f3f3f
char c[100005];
int dp1[100005];
int dp2[100005];
int pre[100005];
int main() {
while(~scanf("%s",c)) {
int m , t = -1;
m = strlen(c);
// z
for(int i = 0; i < m; i++) {
if(c[i] == 'z') {
dp1[i] = i;
t = i;
}
else {
dp1[i] = max;
pre[i] = t;
}
}

// c
t = -1;
for(int i = 0; i < m; i++) {
if(c[i] == 'c' && pre[i] != -1) {
dp2[i] = dp1[pre[i]];
t = i;
}
else {
dp2[i] = max;
pre[i] = t;
}
}

// m
t = -1;
for(int i = 0; i < m; i++) {
if(c[i] == 'm' && pre[i] != -1) {
dp1[i] = dp2[pre[i]];
t = i;
}
else {
dp1[i] = max;
pre[i] = t;
}
}

// u
int mn = max;
for(int i = 0; i < m; i++) {
if(c[i] == 'u' && pre[i] != -1) {
dp2[i] = dp1[pre[i]];
}
else {
dp2[i] = max;
}
}

for(int i = 0; i < m; i++)
if(dp2[i] != max)
mn = std::min(mn , i - dp2[i] - 3);
if(mn == max) mn = -1;
printf("%d\n",mn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: