欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019.3.23 提高A组 T3 JZOJ 4673 LCS Again

程序员文章站 2022-04-01 19:22:35
...

DescriptionDescription

现在有一个长度为nn的串SS,其中每一个字母都是前m个小写字母
计算有多少个不同的长度为nnTT(其中TT也是由前mm个小写字母组成),并且S与T的LCS为n1n-1
LCS就是同时存在于S4S4和T$的最长子序列

n100000n\leq 100000


SolutionSolution

荣斥瞎搞


CodeCode

#include<cstdio>
#include<cstring>
using namespace std;int n,m,k;
char s[100001];
long long ans;
signed main()
{
	scanf("%d%d\n",&n,&m);
	scanf("%s",s+1);
	ans=n*(m-1);
	for(register int i=2;i<=n;i++) if(s[i]!=s[i-1]) ans+=n*(m-1);
	k=1;
	for(register int i=2;i<=n;i++)
	{
		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("%I64d",ans);
}