社区讨论

求条

P13790「CZOI-R6」Border参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhj07w1q
此快照首次捕获于
2025/11/03 18:35
4 个月前
此快照最后确认于
2025/11/03 18:35
4 个月前
查看原帖
上信息课写的,有点糊涂qwq
就过了subtask1第一个点,样例都过了
做发:枚举border长度,二分border第一个不同
若无不同满足满足条件,有不同则二分第二处不同,若没有第二处不同则满足条件,否则若第二出不同与第一处不同在同一位置且更改后一样则寻找是否有第三处不同,有则不满足条件,否则满足。
C
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e6+5;
const int base=114;
const int Mod=1e9+7;
int a[N];
int p[N];
int f(int y,int x)
{
    return (a[y]-a[x-1]*p[y-x+1]%Mod)%Mod;
}
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	string s;
    cin>>s;
    for(int i=1;i<=(int)s.size();i++) a[i]=(a[i-1]*base+(s[i-1]-'a'+1))%Mod;
    //for(int i=1;i<=(int)s.size();i++) cout<<a[i]<<" ";
    p[0]=1;
    for(int i=1;i<=(int)s.size();i++) p[i]=p[i-1]*base%Mod;
    int ans=0;
    for(int i=1;i<(int)s.size();i++)
    {
     //cout<<i<<":"<<endl;
        int l=1,r=i;
        int id=-1;
        //cout<<f(1,1)<<" "<<f(4,4)<<endl;
        while(l<=r)
        {
            int mid=l+r>>1;
            //cout<<mid<<" ";
            if(f(mid,1)!=f(s.size()+mid-i,s.size()-i+1))
            {
                r=mid-1;
                id=mid;
                
            }
            else l=mid+1;
        }
     //cout<<id<<endl;
        if(id==-1) ans=max(ans,i);
        else
        {
            //cout<<"114514 "<<id-1<<" "<<s.size()-i+id-1<<endl;
            l=id+1,r=i;
            int Id=-1;
            int L=l;
            while(l<=r)
            {
                int mid=l+r>>1;
                    //cout<<mid<<" "<<L<<" "<<s.size()<<" "<<s.size()-mid+L<<endl;
                if(f(mid,L)!=f(s.size()+mid-i,s.size()-i+L))
                {
                    r=mid-1;
                    Id=mid;
                }
                else l=mid+1;
            }
            //cout<<Id<<endl;
            if(Id==-1) ans=max(ans,i);
            else
            {
                if(Id==s.size()-i+id&&s[s.size()-i+Id-1]==s[id-1])
                {
                    l=Id+1,r=i;
                    Id=-1;
                    L=l;
                    while(l<=r)
                    {
                        int mid=l+r>>1;
                        if(f(mid,L)!=f(s.size()+mid-i,s.size()-i+L))
                        {
                            r=mid-1;
                            Id=mid;
                        }
                        else l=mid+1;
                    }
                    if(Id==-1) ans=max(ans,i);
                }
            }
        }
    }
    cout<<ans;
	return 0;
}
拜谢awa

回复

0 条回复,欢迎继续交流。

正在加载回复...