<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      10.14 NOIP 模擬賽 T1. Happy·Lovely·Everyday!

      思路

      不難發現等價于劃分序列, 對序列內部做異或和, 求本質不同的最終序列的數量

      考慮去重, 子序列計數去重用的是欽定盡量往前匹配
      本題中, 對于任意一種最終序列, 我們可以限制每個劃分塊都必須是最小的, 也就是攢夠要的趕緊跑路
      也就是若要 \(1\), 就找到后面第一個 \(1\) 劃分, 若要 \(0\), 就找直接一個 \(0\) 或者連續兩個 \(1\)
      然后最后找任意結尾, 加上最后一段算方案數

      #include <bits/stdc++.h>
      #define int long long
      const int MAXN = 2e6 + 20;
      const int MOD = 998244353;
      
      int add(int x, int y) { return x + y >= MOD ? x + y - MOD : x + y; }
      
      int a[MAXN];
      int f[MAXN];
      int nxt1[MAXN];
      std::unordered_set<long long> vis;
      signed main() {
          // freopen("a.in", "r", stdin);
          // freopen("a.out", "w", stdout);
          int _; scanf("%lld", &_);
          while (_--) {
              std::string astr; std::cin >> astr;
              int n = astr.size();
              bool sp = true;
              for (int i = 1; i <= n; i++) a[i] = astr[i - 1] - '0', sp &= (a[i] == 1);
              a[n + 1] = 1; a[n + 2] = 1;
      
              /*找每個位置后第一個 1*/
              for (int i = n + 2; i >= 1; i--) {
                  if (a[i]) nxt1[i] = i;
                  else nxt1[i] = nxt1[i + 1];
              }
              /*dp*/
              f[0] = 1;
              for (int i = 1; i <= n; i++) f[i] = 0;
              for (int i = 0; i <= n; i++) {
                  if (a[i + 1]) {
                      if (i + 1 <= n) f[i + 1] = add(f[i + 1], f[i]);
                  }
                  else {
                      if (nxt1[i + 1] <= n) f[nxt1[i + 1]] = add(f[nxt1[i + 1]], f[i]);
                  }
      
                  if (!a[i + 1]) {
                      if (i + 1 <= n) f[i + 1] = add(f[i + 1], f[i]);
                  }
                  else {
                      if (nxt1[nxt1[i + 1] + 1] <= n) f[nxt1[nxt1[i + 1] + 1]] = add(f[nxt1[nxt1[i + 1] + 1]], f[i]);
                  }
              }
      
              int ans = 0;
              for (int i = 0; i <= n - 1; i++) {
                  ans = add(ans, f[i]);
              }
              printf("%lld\n", ans);
          }
      
          return 0;
      }
      

      總結

      最小構造用于去重還是很牛的

      posted @ 2025-10-14 22:03  Yorg  閱讀(3)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 万载县| 老色批国产在线观看精品| 国产午夜亚洲精品不卡下载| 波多野结衣av高清一区二区三区| 国产三级精品三级在线观看| 久久综合精品成人一本| 宅男噜噜噜66网站高清| 丹巴县| 亚洲精品视频一二三四区| 成人免费亚洲av在线| 看亚洲黄色不在线网占| 国产一区二区三区导航| 国产亚洲综合另类色专区| 久久婷婷五月综合色99啪ak| 灌云县| 福利一区二区不卡国产| 国产高清在线精品一区APP| 滨海县| 免费看国产精品3a黄的视频| 亚洲一区二区三区自拍公司| 武强县| 国产成人精品成人a在线观看| 狠狠亚洲丁香综合久久| 台南市| 欧美 亚洲 国产 制服 中文| 丁香五月亚洲综合在线国内自拍| 免费视频国产在线观看| 一区二区三区四区激情视频| 日韩精品成人一区二区三| 亚洲中文字幕无码一久久区| 毛片网站在线观看| 精品乱人码一区二区二区| 四虎库影成人在线播放| 国产精品久久久久久久专区| 亚洲av中文乱码一区二| 性无码一区二区三区在线观看 | 亚洲av成人在线一区| 亚洲日韩欧洲乱码av夜夜摸| 嫩草院一区二区乱码| 国产乱子伦视频在线播放| 色呦呦九九七七国产精品|