前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法竞赛】AtCoder Beginner Contest 284 D, F

【算法竞赛】AtCoder Beginner Contest 284 D, F

作者头像
Livinfly
发布2023-01-08 09:09:29
3020
发布2023-01-08 09:09:29
举报
文章被收录于专栏:Livinfly

D

赛时并没有意识到枚举范围在三次根号n里,加上自己手写的二分sqrt挂了(丢人),一直没过去,后面把sqrt部分改好也就过了。

所以本题只需要枚举,然后,稍微分i是p还是q一下就行。

然后看了看jls和dls的提交sqrt的实现,偷了偷了。

代码语言:javascript
复制
// jls
LL Sqrt(LL n) {
    LL v = sqrt(n);
    while ((v + 1) * (v + 1) <= n) v++;
    while (v * v > n) v--;
    return v;
}

// dls
LL t = sqrt(n)+0.1;

F

字符串双哈希判一下就行。

赛时想到类似kmp的快速判断字符串相等,并没有实现。

然后,顺便就偷了dls双哈希的板子(自己稍微改了变量名什么的)

代码语言:javascript
复制
#pragma GCC optimize(2)

#include <bits/stdc++.h>

#define fi first
#define se second
#define mkp(x, y) make_pair((x), (y))
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<int,int> hashv;
const LL mod1=1000000007;
const LL mod2=1000000009;
 
hashv operator + (hashv a,hashv b) {
    int c1=a.fi+b.fi,c2=a.se+b.se;
    if (c1>=mod1) c1-=mod1;
    if (c2>=mod2) c2-=mod2;
    return mkp(c1,c2);
}
 
hashv operator - (hashv a,hashv b) {
    int c1=a.fi-b.fi,c2=a.se-b.se;
    if (c1<0) c1+=mod1;
    if (c2<0) c2+=mod2;
    return mkp(c1,c2);
}
 
hashv operator * (hashv a,hashv b) {
    return mkp(1ll*a.fi*b.fi%mod1,1ll*a.se*b.se%mod2);
}

const int N = 2e6+10;

int n;
char s[N];
hashv pw[N], Hx[N], rHx[N], base=mkp(13331,23333);

int main() {
    // ios::sync_with_stdio(0);
    // cin.tie(0);
    // cout << fixed;  // << setprecision(20); // double
    // freopen("i.txt", "r", stdin);
    // freopen("o.txt", "w", stdout);
    scanf("%d", &n);
    n *= 2;
    scanf("%s", s+1);
    pw[0]=mkp(1,1);
    for (int i=1;i<=n;i++) 
        pw[i]=pw[i-1]*base, Hx[i] = Hx[i-1]*base+mkp(s[i],s[i]);
    for(int i = n; i >= 1; i --) 
        rHx[i] = rHx[i+1]*base+mkp(s[i], s[i]);
    for(int i = 0; i <= n/2; i ++) {
        hashv hx1 = Hx[i]*pw[n/2-i]+(Hx[n]-Hx[n/2+i]*pw[n/2-i]);
        hashv hx2 = rHx[i+1]-rHx[n/2+i+1]*pw[n/2];
        if(hx1 == hx2) {
            for(int j = n/2+i; j > i; j --)
                printf("%c", s[j]);
            puts("");
            printf("%d\n", i);
            return 0;
        }
    }
    puts("-1");
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年01月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • D
  • F
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档