日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF-1147D Palindrome XOR (建图划分等价类)

發布時間:2024/4/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF-1147D Palindrome XOR (建图划分等价类) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CF-1147D Palindrome XOR (建圖劃分等價類)

題目鏈接

題意

給一個長度為n的01串c(可能存在’?’,表示可以為0或是1)

問多少個數對(a,b)滿足:

  • $ 1\le a < b<2^n$
  • a,b的二進制都為回文串
  • a ^ b = c
  • 思路

    建圖劃分等價類

    枚舉a的長度[1, n-1]

    0:表示兩個數字相同

    1:表示兩個數字不同

    回文串對應的位置建0邊

    按照異或結果建0,1邊

    因為有默認限制a,b的起始位置為1,a的前置位為0,所以需要另找兩個點表示這種關系,否則會多出幾塊.

    最后dfs判斷合法性,并計算一共分成幾塊,答案就是2的冪次

    #include <bits/stdc++.h> using namespace std; const int mod = 998244353; const int maxn = 2e3 + 5; char s[maxn]; int vis[maxn]; vector<pair<int,int>> g[maxn]; void add(int u, int v, int c) {g[u].push_back(make_pair(v, c));g[v].push_back(make_pair(u, c)); } int check(int u) {if (vis[u] == -1) vis[u] = 0;for (int i = 0; i < (int)g[u].size(); ++i) {int v, c;tie(v, c) = g[u][i];if (vis[v] == -1) {vis[v] = c ? vis[u]^1 : vis[u];if (check(v) == 0) return 0;}else {if ((c && vis[v] == vis[u]) || (!c && vis[v] != vis[u])) return 0;}}return 1; } long long Pow(long long a, long long b) {long long ret = 1;while (b) {if (b & 1) {ret *= a;ret %= mod;}a *= a;a %= mod;b >>= 1;}return ret; } long long solve(int n, int m) {for (int i = 0; i < maxn; ++i) g[i].clear();for (int i = 1; i <= n/2; ++i) add(i, n+1-i, 0);for (int i = 1; i <= m/2; ++i) add(n+n-m+i, n+n+1-i, 0);for (int i = 1; i <= n; ++i) {if (s[i-1] == '?') continue;add(i, i+n, s[i-1]-'0');}add(2*n+1, 1, 0); // 2*n+1 : 1add(2*n+1, n+n-m+1, 0);for (int i = 1; i <= n-m; ++i) add(2*n+2, i+n, 0); // 2*n+2 : 0int cnt = 0;fill(vis, vis+maxn, -1);for (int i = 1; i <= 2*n+2; ++i) {if (vis[i] != -1) continue;if (check(i)) cnt++;else return 0;}return Pow(2, cnt-1); // 默認b的首位為1,a的首位為0 } int main() {scanf("%s", s);int len = strlen(s);long long ans = 0;for (int i = 1; i < len; ++i) {ans += solve(len, i);ans %= mod;}printf("%lld\n", ans % mod);return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的CF-1147D Palindrome XOR (建图划分等价类)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。