ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF578D LCS Again

2020-11-24 09:00:50  阅读:131  来源: 互联网

标签:ababababbaba Again abababaababa LCS 字符 int CF578D 字符串 include


题目链接

题意分析

怎么说呢 感觉这道题还是找规律套结论

首先 对于一个字符串 我们最直观的想法就是去掉一个字符 然后再在其余n个位置每个位置可以有m-1种字符插入

那么就存在n*(m-1)种方案

但是存在重复的

  1. 对于aaabbbccc这种存在一段连续相同字符的字符串 很显然 一段连续相同字符的话 我们只能算上一种

2.我们考虑这样一种字符串abababababab

abababababa_ → abababaababa_ → abababaababa
abababa_abab → abababa_ababa → abababaababa

abababababa_ → ababababbaba_ → ababababbaba
abababab_bab → abababab_baba → ababababbaba

对于一个长度为k的这样的字符串

第2个字符存在1个子串 第3个字符存在2个子串 ... 第k个字符存在k-1个子串

所以一共存在\(\frac{k(k-1)}{2}\)种重复情况

所以我们需要把这些也去除掉

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define M 100080
using namespace std;
char s[M];
int n,m;
long long ans,k;
int main()
{
	scanf("%d%d",&n,&m);
	scanf("%s",s+1);
	for(int i=1;i<=n;++i)
	if(s[i]!=s[i-1]) ans+=(long long)n*(long long)(m-1);
	k=1LL;
	for(int i=2;i<=n;++i)
	{
		if(k==1)//这是起始的边界情况处理
		{
			if(s[i]!=s[i-1]) ++k;
		}
		else
		{
			if(s[i]==s[i-2]) ++k;//按照上述字符串的要求进行处理
			else
			{
				ans-=k*(k-1)/2;
				if(s[i]!=s[i-1]) k=2LL;//这是起始的边界情况
				else k=1LL;
			}
		}
	} 
	ans-=k*(k-1)/2;
	printf("%lld\n",ans);
	return 0;
} 

标签:ababababbaba,Again,abababaababa,LCS,字符,int,CF578D,字符串,include
来源: https://www.cnblogs.com/LovToLZX/p/14028443.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有