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;
}
上一题
下一题