先考虑判断一个串是否存在一个合法的转化方案,可以用一个栈维护当前还没有被匹配的字符,从左往右扫描字符串,如果当前字符和栈顶元素相同,则弹栈,否则把当前字符压入栈中。这个串合法的重要条件是最后栈为空,可以判断以i开头的所有字符串中有多少个是合法的。
#include<bits/stdc++.h>
using namespace std;
int n,tmp;
char s[1000010];
map<long long,int> m;
long long has[1000010];
char S[1000010];
long long ans;
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
m[0]++;
for(int i=1;i<=n;i++)
{
if(!tmp||S[tmp]!=s[i])
{
S[++tmp]=s[i];
has[tmp]=has[tmp-1]*999999999+int(s[i]);
}
else
tmp--;
ans+=m[has[tmp]];
m[has[tmp]]++;
}
cout<<ans;
}
来源:zr