作者:施华洛卉子 | 来源:互联网 | 2022-12-25 20:23
思路:可以说也是一个模拟题目吧,我们这么考虑,先开始找到一组满足都有love的位置,记录start和end,这个时候我们可以求出再向后加字符串的情况,例如LOVEAAA第1-4匹配了,那么以
思路:
可以说也是一个模拟题目吧,我们这么考虑,先开始找到一组满足都有love的位置,记录start和end,这个时候我们可以求出再向后加字符串的情况,例如
LOVEAAA第1-4匹配了,那么以start=1,end=4状态情况下情况可以使LOVE LOVEA LOVEAA LOVEAAA四种情况,是和n-end+1
那么当我们匹配的时候,让start向前走,如果还匹配,我们在求一次和结果相加!如果不匹配了,我们一直向后找更新end,知道匹配为止。一直到最后就行了
注意!可以记录LOVE的个数和满足的个数,可以用一个数组记录。然后就是写循环时细心一点,我代码i和j位置不太友好可能有点别扭。。。
#include
#define input freopen("input.txt","r",stdin)
using namespace std;
int v[26];
int main(){
int t,i,j,n;
string s;
while(scanf("%d",&t)!=EOF){
while(t--){
cin>>s;
int number=0,start=0,end=-1;
memset(v,0,sizeof(v));
long long ans=0;
for(j=0;j if(number<4){
for(i=end+1;i if(number<4){
if(s[i]=='L'||s[i]=='O'||s[i]=='V'||s[i]=='E'){
if(v[s[i]-'A']==0){
number++;
}
v[s[i]-'A']++;
}
}
if(number==4){
end=i;
break;
}
}
}
if(number==4){
ans+=(s.size()-end);
}
if(v[s[j]-'A']>0&&v[s[j]-'A']==1){
v[s[j]-'A']--;
number--;
}
else if(v[s[j]-'A']>0){
v[s[j]-'A']--;
}
}
cout< }
}
return 0;
}