Friends 题解

Friends

https://ac.nowcoder.com/acm/contest/954/E

hash好题!而且nowcoder的数据比bzoj强多了qwq。在字符串中删除一个数的话,假设那个数为x,并且这个字符串的下标起止为,那么要把这段的hash值乘上。于是这题做完了,直接枚举这个删掉的点就好,注意枚举子串hash的方法。尽量函数式编程简化代码。

#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

#define N 2000100
#define ll unsigned long long
#define base 233

ll h[N], p[N], ha;
char s[N], ans[N];
int n;
ll t1 = 0, t2 = 0, t = 0;

ll get_hash(int l, int r) {return h[r] - h[l - 1] * p[r - l + 1];}

bool check(int x) {
    if(x > n / 2) t1 = get_hash(1, n / 2), t2 = get_hash(n / 2 + 1, x - 1) * p[n - x] + get_hash(x + 1, n);
    else t1 = get_hash(n / 2 + 2, n), t2 = get_hash(1, x - 1) * p[n / 2 - x + 1] + get_hash(x + 1, n / 2 + 1);
    return t1 == t2;
}

int main() {
    p[0] = 1;
    for(int i = 1; i < 2000000; ++i) p[i] = p[i - 1] * base;
    scanf("%d%s", &n, s + 1);
    if(!(n & 1)) return puts("NOT POSSIBLE"), 0;
    for(int i = 1; i <= n; ++i) {
        h[i] = h[i - 1] * base + (ll)(s[i]);
    }
    int pos = 0;
    for(int i = 1; i <= n; ++i) {
        if(check(i)) {
            if(!t) t = t1;
            else if(t != t1) return puts("NOT UNIQUE"), 0;
            pos = i;
        }
    }
    if(!pos) return puts("NOT POSSIBLE"), 0;
    if(pos <= n / 2) for(int i = n / 2 + 2; i <= n; ++i) putchar(s[i]);
    else for(int i = 1; i <= n / 2; ++i) putchar(s[i]);
}
全部评论

相关推荐

大厂的边缘业务去了也没啥用,也得不到任何成长,尤其是审核、中台这种价值产出不清楚的,别被大厂光环蒙蔽了双眼,如果你找实习工作,优先找"离钱近的业务",钱多的业务福利年终奖啥的都不会差的
陈100:呵呵。 你在大厂工作2年,后面准备好,可以随便跳很多公司。 去小厂,现在拿到所谓多的钱,有啥用啊,未来没有了。 而且应届生,工作没几年的,也不是赚钱的时间。
点赞 评论 收藏
分享
买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
我看到好多人都在说0offer好焦虑,结果一看是投了百度快手字节啥的。好像大家都是只想通过校招进大厂,对小公司是不考虑的吗😂可是能进大厂的难道不是只有少部分人吗,真心发问
梦想是成为七海千秋:沉默的大多数吧,喜欢晒的都是能引起共鸣的大厂,找小厂的人,别人也不认识你这个小厂,就自己偷偷找了实际上大多数人哪有什么机会能找到大厂
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务