JZOJ 4673. [増加]再び、模擬レースT3 LCSのセット

効果の件名:

今ストリングSの各文字が前に小文字のmとnは、長有する
異なる長さN(T mが、第一小文字で書かれている)Tの数を計算し、SおよびT N-1 LCSは
、最長シーケンスはLCSとS Tの両方に存在します

問題解決のアイデア:

隣接するブロック、回答寄与の各ブロックと同じ文字 n個 × メートル n \回メートル
私たちは、文字列があるときことがわかりました。 A B A B ABAB その後、我々は次の場合に分離することを推測することができ、その答えが繰り返され、それはまた、等間隔の文字で繰り返されます バツ バツ の繰り返し C バツ 2 C ^ 2_x 二次

そして、あなたは答えを得ることができます

A c c e p t e d   c o d e : 受け入れ\コード:

#include<cstdio>
#define ll long long

using namespace std;

const ll N = 100005;
ll n, m, ans, k;
char s[N];

int main() {
	scanf("%lld %lld", &n, &m);
	scanf("%s", s+1);
	ans = 1;
	for (ll i = 2; i <= n; ++i)
	  ans += (s[i] != s[i-1]);
	ans *= n * m - n; k = 1;
	for (ll i = 2;i <= n; ++i)
		if (k == 1) k += (s[i] != s[i-1]);
	  	else if(s[i] == s[i-2]) ++k;
	  	else {
	  		ans -= k * (k-1) / 2;
	  		k = (s[i] != s[i-1]) + 1;
	  	}
	ans -= k * (k-1) / 2;
	printf("%lld", ans);
}

おすすめ

転載: blog.csdn.net/qq_39798042/article/details/88900925