問題レポートにcodeforces 1291D既約アナグラムソリューション

codeforces 1291D既約アナグラム
質問の意味:
二つの文字列S、T、tは再配置することができ、場合にのみ場合、文字列は、文字Sによって得られた場合、すなわち二つの文字列の数が同じこれは、各文字が表示されますが、場所が可能彼らはアナグラムと呼ばれ、異なる2つの文字列Sの定義がある場合、tは還元性アナグラムには、以下の条件を満たしている必要があります。
1.Sトンとアナグラム同士、S、T、それぞれ二つの文字列連続するサブストリングにK分割
2.s1は、S2⋯SK、Sに配置された
TK⋯Tの中に配置3.t1、T2、
4.∀i∈[1、k]は、アナグラムSI TI有している
今の文字を与え文字列は、見つけることができ、一定の範囲内の部分文字列を聞いて、必ずサブストリング既約アナグラムを。(注:これは、満足していません)

合理的な分析
詳細なサンプル後の分析と法を見つけるためには、大きく3つの文字列が「はい」の条件を満たすようにしている見つけることができます:
1。サンプルは、非常に簡単に見つけることです、L == R時間が、唯一の1文字kの以上2、そうしてください満足していないことが還元可能である条件アナグラム、既約アナグラム。
2文字の数が3の時間間隔合計よりも大きい、それが構築される既約に 3つの文字がある場合、アナグラムを、その後、長い文字位置ABBCとして見つけることができるように自由に交換可能なような文字列やABC 還元不可能に重複がある場合、アナグラムをそのようなABCA、明らかに満足BAACとして文字、既約アナグラムの関係は、第3列との間の関係は、以下の構造によって形成されてもよいです。
3は、すでにS [L]を通じて関与している!=はどこのように、最後の文字が新しい文字列のように交換し最初と最後の文字の形状限り、等しくないです[R]、どんなに元のパーティション文字列は、最初の文字と一致していない最後の文字は、形成することはできません還元性アナグラムを。

コード:

#include <algorithm> 
#include <iostream>
#include <string>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 10;
#define pi 3.141592653589794626
int i, j, k;
int m, n, q;
string s;
int cnt[maxn][30];
int main() {
	cin >> s;
	for (i = 0; i < s.size(); i++) {
		for (j = 0; j < 26; j++) {
			cnt[i][j] += cnt[i - 1][j];
		}
		cnt[i][s[i] - 97]++;
	}
	int t;
	cin >> t;
	while (t--) {
		int l, r;
		cin >> l >> r;
		int sum = 0;
		l--;
		r--;
		for (i = 0; i < 26; i++)
			if (cnt[r][i] - cnt[l - 1][i])
				sum++;
		if (l == r) {
			cout << "Yes" << endl;
			continue;
		}
		if (sum >= 3) {
			cout << "Yes" << endl;
			continue;
		}
		if (s[l] == s[r]) {
			cout << "No" << endl;
			continue;
		}
		cout << "Yes" << endl;
	}
	return 0;
}

それでも配列範囲ああTVTの世話をする必要が
悲しい教訓(ささやきBB)

リリース5元の記事 ウォンの賞賛0 ビュー444

おすすめ

転載: blog.csdn.net/qq_43470416/article/details/104240387