1. 程式人生 > >苦逼的單身狗 (尺取法)

苦逼的單身狗 (尺取法)

subject esc 性格 top 結果 include strong ans \n

題目傳送門

苦逼的單身狗 時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

雙11又到了,小Z依然只是一只單身狗,對此他是如此的苦惱又無可奈何。

為了在這一天脫單小Z決定向女神表白,但性格靦腆的小Z決定隱晦一點,截取一段包含‘L‘、‘O‘、‘V‘、‘E‘的英文。(順序不限)

小Z想起之前小D送給他一本英文書,決定在這裏面截取一段話,小Z發現有好多種方案來截取這段話。

你能知道小Z能有多少種方案截取這段話麽?

為了簡化問題,英文文本講不會出現空格、換行、標點符號及只有大寫的情況。

輸入描述:

本題有T組數據。
對於每組數據只有一行文本。
1≤T≤20
1≤文本長度≤100000

輸出描述:

輸出結果,並換行。
輸入:

3
ILOVEACM
LOVELOVE
ALBECVOD

輸出:

8
15
4

題意:找出包含LOVE的子串數目

題解這題可以用尺取法做,而且答案就是每次的len-R

代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define
MAX 100005 string s; int T; ll ans; map<char,int>cnt; int main() { //cout<<ok()<<endl; cin>>T; while(T--) { s=""; cnt.clear(); cin>>s; int len=s.size(); int st=0,ed=0; ans=0; int num=0; while(1)
{ while(ed<len&&num<4){ if(s[ed]==L||s[ed]==E||s[ed]==V||s[ed]==O) { cnt[s[ed]]++; if(cnt[s[ed]]==1) num++; } ed++; } if(num<4) break; //printf("ed %d \n",ed); ans+=len-ed+1; if(s[st]==L||s[st]==E||s[st]==V||s[st]==O) { cnt[s[st]]--; if(cnt[s[st]]==0) num--; } st++; // printf("st %d \n",st); } cout<<ans<<endl; } }



苦逼的單身狗 (尺取法)