苦逼的單身狗 (尺取法)
阿新 • • 發佈:2018-09-01
subject esc 性格 top 結果 include strong ans \n
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目傳送門
苦逼的單身狗 時間限制: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;
}
}
苦逼的單身狗 (尺取法)