hihocode 1485 hiho字串
阿新 • • 發佈:2019-02-13
時間限制:10000ms
單點時限:1000ms
記憶體限制:256MB
描述
如果一個字串恰好包含2個’h’、1個’i’和1個’o’,我們就稱這個字串是hiho字串。
例如”oihateher”、”hugeinputhugeoutput”都是hiho字串。
現在給定一個只包含小寫字母的字串S,小Hi想知道S的所有子串中,最短的hiho字串是哪個。
輸入
字串S
對於80%的資料,S的長度不超過1000
對於100%的資料,S的長度不超過100000
輸出
找到S的所有子串中,最短的hiho字串是哪個,輸出該子串的長度。如果S的子串中沒有hiho字串,輸出-1。
樣例輸入
happyhahaiohell
樣例輸出
5
很多方法寫。 因為是恰好 包括 hhio ,一個字元再次出現時,必定是以,該字元後的字元組成hhio,所以更新前面的字元就好。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
int m[6];
int H = 1, h = 0,i=2, o=3;
char s[100005];
bool judge(){
if(m[h]&&m[H]&&m[i]&&m[o]) return true;
else return false;
}
int getmin(){
int x = 0x7fffffff;
for(int i=0;i<4;i++){
x = min(x,m[i]);
}
return x;
}
int getmax(){
int x =-1;
for(int i=0;i<4;i++){
x = max(x,m[i]);
}
return x;
}
void init(){
m[H] = m[h]=m[i]=m[o]=0;
}
int main(){
while (scanf("%s",s) != EOF) {
init();
int len = strlen(s), ans = 0x7fffffff;
for(int j=0;j<len;j++){
if(s[j]=='h'){
if(m[h]==0){
m[h] = j;
}
else if(m[H]==0){
m[H] = j;
}
else{
if(m[o] < m[h]) m[o] = 0;
if(m[i] < m[h]) m[i] = 0;
m[h] = m[H], m[H] = j;
}
}
if(s[j]=='i'){
if(m[H]<m[i]) m[H] = 0;
if(m[h]<m[i]) m[h] = 0;
if(m[o]<m[i]) m[o] = 0;
m[i] = j;
}
if(s[j]=='o'){
if(m[H]<m[o]) m[H] = 0;
if(m[h]<m[o]) m[h] = 0;
if(m[i]<m[o]) m[i] = 0;
m[o] = j;
}
if(judge()){
int x = getmin();
int y = getmax();
x = y-x+1;
ans = min(ans,x);
}
}
if(ans == 0x7fffffff) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}