链接:https://ac.nowcoder.com/acm/problem/14547
来源:牛客网

题目描述

双11又到了,小Z依然只是一只单身狗,对此他是如此的苦恼又无可奈何。

为了在这一天脱单小Z决定向女神表白,但性格腼腆的小Z决定隐晦一点,截取一段包含'L'、'O'、'V'、'E'的英文。(顺序不限)

小Z想起之前小D送给他一本英文书,决定在这里面截取一段话,小Z发现有好多种方案来截取这段话。

你能知道小Z能有多少种方案截取这段话么?

为了简化问题,英文文本讲不会出现空格、换行、标点符号及只有大写的情况。

输入描述:

本题有T组数据。
对于每组数据只有一行文本。
1≤T≤20
1≤文本长度≤100000

输出描述:

输出结果,并换行。
示例1

输入

3
ILOVEACM
LOVELOVE
ALBECVOD

输出

8
15
4

题意:给一个字符串然后选取一段子串并且这一段包含"LOVE"四个字母,字母顺序不限
题解:遍历字符串,记录出现"LOVE"四字母时下标,当四字母均遍历到,然后去最小的ans+最小下标再加1
因为当四字母均有时 假设遍历到最后四字母最后一个剩余的时候结束,那么此时满足题意的情况是,最小下标加1种
然后代码如下:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char t[100007];
 4 int main()
 5 {
 6     int T;scanf("%d",&T);
 7     while(T--)
 8     {
 9         scanf("%s",&t);
10         int L=strlen(t);
11         long long ans=0;
12         int l=-1,o=-1,v=-1,e=-1,d;
13         for(int i=0;i<L;i++)
14         {
15             if(t[i]=='L')l=i;
16             else if(t[i]=='O')o=i;
17             else if(t[i]=='V')v=i;
18             else if(t[i]=='E')e=i;
19             d=min(min(l,o),min(v,e));
20             if(d!=-1)ans+=d+1;
21         }
22         printf("%lld\n",ans);
23     }
24     return 0;
25 }
View Code