BZOJ2803[Poi2012]Prefixuffix——hash

BZOJ2803[Poi2012]Prefixuffix——hash

题目描述

对于两个串S1、S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同。例如串ababba和串abbaab是循环相同的。
给出一个长度为n的串S,求满足下面条件的最大的L:
1. L<=n/2
2. S的L前缀和S的L后缀是循环相同的。

输入

第一行一个正整数n (n<=1,000,000)。第二行n个小写英文字母,表示串S。

输出

一个整数,表示最大的L。

样例输入

15
ababbabababbaab

样例输出

6
 
假设两个串是循环同构的,那么这两个串可以表示成x+y和y+x的形式(其中x,y为两个字符串)
设f[i]表示前后都去掉i个字符后能匹配的最长前后缀长度,即y的最长长度。
手画一下能够发现对于位于左一半的i和i+1,f[i]<=f[i+1]+2。如果大于了就说明f[i+1]还能更大。
那么就可以从中间向开头转移f[i],最后求出i+f[i]的最大值即可。这道题卡自然溢出。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll h[1000010];
ll g[1000010];
ll base1[1000010];
ll base2[1000010];
char ch[1000010];
int mod=1e9+7;
int n;
int f[1000010];
int ans=0;
bool check(int x,int y,int l)
{
    ll s1,s2,t1,t2;
    s1=((h[x+l-1]-h[x-1]*base1[l])%mod+mod)%mod;
    s2=((g[x+l-1]-g[x-1]*base2[l])%mod+mod)%mod;
    t1=((h[y+l-1]-h[y-1]*base1[l])%mod+mod)%mod;
    t2=((g[y+l-1]-g[y-1]*base2[l])%mod+mod)%mod;
    if(s1==t1&&s2==t2)
    {
        return true;
    }
    return false;
}
int main()
{
    scanf("%d",&n);
    scanf("%s",ch+1);
    base1[0]=1;
    base2[0]=1;
    for(int i=1;i<=n;i++)
    {
        base1[i]=base1[i-1]*233%mod;
        base2[i]=base2[i-1]*2333%mod;
        h[i]=(h[i-1]*233+(ch[i]-96))%mod;
        g[i]=(g[i-1]*2333+(ch[i]-96))%mod;
    }
    for(int i=n/2;i>=1;i--)
    {
        f[i]=min(f[i+1]+2,(n-2*i)/2);
        while(f[i]&&(!check(i+1,n-f[i]+1-i,f[i])))
        {
            f[i]--;
        }
    }
    for(int i=1;i<=n/2;i++)
    {
        if(!check(1,n-i+1,i))
        {
            continue;
        }
        ans=max(ans,f[i]+i);
    }
    printf("%d",ans);
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9637166.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101431.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMware中卸载Ubuntu「建议收藏」

    VMware中卸载Ubuntu「建议收藏」1、右键>>管理>>从磁盘中删除2、点击“是”,磁盘路径安装Ubuntu的文件一并删除

    2022年8月30日
    16
  • rabbitmq优先级队列_rabbitmq主从模式

    rabbitmq优先级队列_rabbitmq主从模式优先级队列:此队列中的消息可以拥有优先级属性,在发送有优先级属性的消息到此队列时,优先级属性能够生效。优先级高的消息得以提早消费,消息优先级的最大值由队列的属性决定。超出队列的最大值按最大值算。Map<String,Object>priority=newHashMap<String,Object>();priority.put(“x-max-priority…

    2022年9月23日
    5
  • java和python就业情况_java和python哪个就业前景好一些

    java和python就业情况_java和python哪个就业前景好一些Java和python就目前的景象来看,python的就业前景会好一样,但每小我的环境不同,选择上有所差异,根据自身环境来决定就可以了。Java和python的就业前景分析Java和python,无论学习那个语言都是不错的选择,而且他们的应用领域都是很是普遍的,有着自己奇特的优势。就目前这种环境来说,python发展前途更好一点,不过虽然Java没有之前发展那么火爆了,可是Java的应用数量仍是最…

    2022年7月7日
    25
  • iOS面试题(五)

    iOS面试题(五)

    2022年4月2日
    38
  • Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II

    2022年1月25日
    51
  • 安装svn 汉化包 也不能设置中文[通俗易懂]

    (以下为亲测!)汉化包地址:https://osdn.net/projects/tortoisesvn/storage进入地址之后:选择对应版本–>>LanguagePacks–>>选择中文包问题:已经安装svn汉化包,但是不能设置为中文.解决:确保汉化包版本对应svn版本. 如果汉化包版本已经对应svn版本,则把Language文件夹里面东西全部删除,然后再次安装汉化包….

    2022年4月8日
    77

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号