21.10.28模擬 String Coloring AGC26 C
阿新 • • 發佈:2021-10-29
將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