题目
Description
现在有一个长度为n的串S,其中每一个字母都是前m个小写字母
计算有多少个不同的长度为n的T(其中T也是由前m个小写字母组成),并且S与T的LCS为n-1
LCS就是同时存在于S和T的最长子序列
Input
第一行包含两个整数n和m表示S的长度和前m个小写字母
第二行是串S
Output
只要输出存在的T的数量
解题思路
https://blog.csdn.net/doyouseeman/article/details/51971980
代码
#include<cstdio>
#define rep(i,x,y) for (register int i=x;i<=y;i++)
using namespace std;
int n,m,k; long long ans; char s[100001];
int main(){
scanf("%d%d",&n,&m); scanf("%s",s+1);
ans=n*(m-1); rep(i,2,n) if (s[i]!=s[i-1]) ans+=n*(m-1);
k=1;
rep(i,2,n)
if (k==1) {if (s[i]!=s[i-1]) k++;else continue;}
else {
if (s[i]==s[i-2]) k++; else {
ans-=k*(k-1)/2; k=1;
if (s[i]!=s[i-1]) k++;
}
}
ans-=k*(k-1)/2;
printf("%lld",ans);
}