题目链接:https://ac.nowcoder.com/acm/contest/217/B
题目大意:有一串长度为n的字符串s,只包含’m’ ‘s’ 'c’三种字符,请你找出下标位置都不重复的msc和mcc的一段序列s[x,y] 求(x,y)的对数,即有多少个满足条件的连续序列。
思路:将可能的msc和mcc在序列中出现的方式都列出来,共八种,用数组next[x][y]表示位置为x的字母后第一次出现y的位置,然后去暴力枚举8种情况,取长度最短满足的,计算数量累加答案。
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
typedef long long ll;
int n,nextp[maxn][30];
ll ans,tmp; //注意答案要用long long
char str[8][7]={"mscmcc","mmsccc","mmccsc","mmcscc","mccmsc","mcmcsc","msmccc","mcmscc"};
string s;
int main()
{
cin>>n>>s;
s=" "+s;
for(int i='a';i<='z';i++){
for(int j=n;j>0;j--){
nextp[j-1][i-'a']=nextp[j][i-'a'];
if(s[j]==char(i))
nextp[j-1][i-'a']=j;
}
}
ll pos=0;
for(int i=1;i<=n;i++){
tmp=inf;
for(int u=0;u<8;u++){
pos=i-1;
for(int v=0;v<6;v++){
pos=nextp[pos][str[u][v]-'a'];
if(pos==0) break;//找不到该种序列,遍历下一种
}
if(pos!=0)
tmp=min(tmp,pos);//找到一种,更新tmp为最小
}
if(tmp!=inf)
ans+=n-tmp+1;
}
cout<<ans<<endl;
}