2017年浙江中医药大学大学生程序设计竞赛
来源:互联网 发布:于谦 暗黑英雄 知乎 编辑:程序博客网 时间:2024/04/29 08:54
时间限制: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
输入
zcmuumczzzccmmuuaa
输出
0-12
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 longconst 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;intcc=m[bb];if(cc==-1) continue;ans=min(ans,(cc-i+1)-4);}}if(ans==inf){printf("-1\n");}elseprintf("%d\n",ans);}}
阅读全文