Wannafly挑战赛28 B-msc和mcc【思维】

题目链接: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值