1. 程式人生 > >hihocode 1485 hiho字串

hihocode 1485 hiho字串

時間限制: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; }