• BZOJ2160 拉拉队排练【Manacher】


    Description

    艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要。拉拉队的选拔工作已经结束,在雨荨和校长的挑选下,n位集优秀的身材、舞技于一体的美女从众多报名的女生中脱颖而出。这些女生将随着篮球队的小伙子们一起,和对手抗衡,为艾利斯顿篮球队加油助威。一个阳光明媚的早晨,雨荨带领拉拉队的队员们开始了排练。n个女生从左到右排成一行,每个人手中都举了一个写有26个小写字母中的某一个的牌子,在比赛的时候挥舞,为小伙子们呐喊、加油。雨荨发现,如果连续的一段女生,有奇数个,并且他们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体。现在雨荨想找出所有和谐小群体,并且按照女生的个数降序排序之后,前K个和谐小群体的女生个数的乘积是多少。由于答案可能很大,雨荨只要你告诉她,答案除以19930726的余数是多少就行了。

    Input

    输入为标准输入。第一行为两个正整数n和K,代表的东西在题目描述中已经叙述。接下来一行为n个字符,代表从左到右女生拿的牌子上写的字母。

    Output

    输出为标准输出。输出一个整数,代表题目描述中所写的乘积除以19930726的余数,如果总的和谐小群体个数小于K,输出一个整数-1。

    Sample Input

    5 3
    ababa

    Sample Output

    45

    【样例说明】

    和谐小群体女生所拿牌子上写的字母从左到右按照女生个数降序排序后为ababa, aba, aba, bab, a, a, a, b, b,前三个长度的乘积为。

    HINT

    总共20个测试点,数据范围满足:


    思路

    首先对于一个节点,如果存在半径是r的回文串,一定存在半径是r-1的回文串
    然后就前缀和+快速幂就可以了
    水题练练manacher


    //Author: dream_maker
    #include<bits/stdc++.h>
    using namespace std;
    //----------------------------------------------
    //typename
    typedef long long ll;
    //convenient for
    #define fu(a, b, c) for (int a = b; a <= c; ++a)
    #define fd(a, b, c) for (int a = b; a >= c; --a)
    #define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
    //inf of different typename
    const int INF_of_int = 1e9;
    const ll INF_of_ll = 1e18;
    //fast read and write
    template <typename T>
    void Read(T &x) {
      bool w = 1;x = 0;
      char c = getchar();
      while (!isdigit(c) && c != '-') c = getchar();
      if (c == '-') w = 0, c = getchar();
      while (isdigit(c)) {
        x = (x<<1) + (x<<3) + c -'0';
        c = getchar();
      }
      if (!w) x = -x;
    }
    template <typename T>
    void Write(T x) {
      if (x < 0) {
        putchar('-');
        x = -x; 
      }
      if (x > 9) Write(x / 10);
      putchar(x % 10 + '0');
    }
    //----------------------------------------------
    const int N = 2e6 + 10;
    const ll Mod = 19930726;
    char s[N], t[N];
    ll n, k, len = 0;
    ll r[N], pre[N];
    void Manacher() {
      ll maxp = 0, pos = 0;
      fu(i, 1, len) {
        ll x = (maxp > i) ? min(r[pos * 2 - i], maxp - i) : 1;
        while (s[i - x] == s[i + x]) x++;
        if (i + x > maxp) {
          maxp = i + x;
          pos = i;
        }
        r[i] = x;
        if (!(i & 1)) pre[r[i] - 1]++;
      }
    }
    ll mul(ll a, ll b) {
      return a * b % Mod;
    }
    ll fast_pow(ll a, ll b) {
      ll res = 1;
      while (b) {
        if (b & 1) res = mul(res, a);
        b >>= 1;
        a = mul(a, a);
      }
      return res;
    }
    int main() {
      Read(n), Read(k);
      scanf("%s", t);
      s[len] = '|';
      fu(i, 0, n - 1) {
        s[++len] = '#';
        s[++len] = t[i];
      }
      s[++len] = '#';
      s[len + 1] = '&';
      Manacher();
      ll ans = 1;
      fd(i, n, 1) {
        if (!(i & 1)) continue;
        pre[i - 2] += pre[i];
        ans = mul(ans, fast_pow(i, min(k, pre[i])));
        k -= min(k, pre[i]);
        if (!k) break;
      }
      if (k) ans = -1;
      Write(ans);
      return 0;
    }
    
  • 相关阅读:
    查询表结构
    centos使用docker发布.netcore3.0项目
    <五>输入输出模型的建立及登陆验证
    <二>引入NFine样式文件和登录界面
    <一>前言
    使用GUI工具高效构建你自己的Nuget包
    Angular开发者手册重点翻译之指令(一)
    WCF中操作的分界于调用顺序和会话的释放
    WCF中数据契约之已知类型的几种公开方式
    Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎
  • 原文地址:https://www.cnblogs.com/dream-maker-yk/p/9774773.html
Copyright © 2020-2023  润新知