1. 程式人生 > 其它 >21.10.28模擬 String Coloring AGC26 C

21.10.28模擬 String Coloring AGC26 C

將2*n長度的字串拆成兩段,兩段分別計算,開個map

在s1==s2前提下,
s1在前半段出現的從左往右出現的字元,s2一定在後半段從右往左出現
即正序s1前半段=逆序s2後半段,正序s2前半段=逆序s1後半段

typedef long long lxl;
map<pair<string,string>, lxl> cnt;
const int maxn = 50;
char s[maxn];

int main() {
	freopen("b.in", "r", stdin);
	freopen("b.out", "w", stdout);

	int n;
	cin>>n>>s;
	for(int i = 0; i < (1 << n); i++) {
		string s1 = "", s2 = "";
		for(int j = 0; j < n; j++) {
			if(i & (1 << j)) s1 += s[j];
			else s2 += s[j];
		}
		cnt[{s1,s2}]++;
	}
	lxl sum = 0;
	for(int i = 0; i < (1 << n); i++) {
		string s1 = "", s2 = "";
		for(int j = n - 1; j >= 0; j--) {
			if(i & (1 << j)) s1 += s[j + n];
			else s2 += s[j + n];
		}
		sum += cnt[{s1,s2}];
	}
	cout<<sum<<'\n';
}

本文來自部落格園,作者:{2519},轉載請註明原文連結:https://www.cnblogs.com/QQ2519/p/15479832.html