测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A35530. 消消乐(game)

填空题 较难

题目描述

消消乐(game)

题目描述

小L现在在玩一个低配版本的消消乐,该版本的游戏是一维的,一次也只能消除两个相邻的元素。

现在,他有一个长度为n且仅由小写字母构成的字符串。我们称一个字符串是可消除的,当且仅当可以对这个字符串进行若干次操作,使之成为一个空字符串。

其中每次操作可以从字符串中删除两个相邻的相同字符,操作后剩余字符串会拼接在一起。

小L想知道,这个字符串的所有非空连续子串中,有多少个是可消除的。

输入格式

从文件game.in中读入数据。

输入的第一行包含一个正整数n,表示字符串的长度。

输入的第二行包含一个长度为n且仅由小写字母构成的的字符串,表示题目中询问的字符串。

输出格式

输出到文件game.out中。

输出一行包含一个整数,表示题目询问的答案。

样例1输入

8

accabccb

样例1输出

5

样例1解释

一共有5个可消除的连续子串,分别是cc、acca、cc、bccb、accabccb。

样例2

见选手目录下的game/game2.in与game/game2.ans。

样例3

见选手目录下的game/game3.in与game/game3.ans。

样例4

见选手目录下的game/game4.in与game/game4.ans。

参考答案

#include<bits/stdc++.h> #define ll long long using namespace std; const int N=2e6+5; int n,dp[N],a[N][26],to[N]; char s[N]; ll ans; int main() { scanf("%d%s",&n,s+1); for(int i=1;i<=n;i++) { to[i]=i; int x=a[to[i-1]][s[i]-'a']; if(x) to[i]=to[x-1],dp[i]=dp[x-1]+1; a[to[i]][s[i]-'a']=i,ans+=dp[i]; } printf("%lld\n",ans); return 0; }
上一题 下一题