三个朋友

Posted fangbozhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三个朋友相关的知识,希望对你有一定的参考价值。

https://loj.ac/problem/2823

题目描述

  给出一个字符串U,求满足条件的字符串S使其复制一遍再插入一个字符后的字符串为U。

思路

  由于插入过一个字符,所以我们可以进行一次扫描,每次扫描时将这个字符去掉,把去掉后字符串分成长度相等的两段,再比较这两段是否完全相同即可。如果暴力枚举看是否相同肯定会T飞,我们考虑使用字符串Hash,求出两段的Hash值比较是否相等即可。需要注意的有两点:①把字符串取出时注意对进制转换;②有可能会存在多个相等的S,它们不算重复。

代码

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const ull p=47;
char s[2000005];
ull sum[2000005],power[2000005];
int main() 

//    freopen("aa.txt","r",stdin);
    int n;
    scanf("%d",&n);
    scanf(" %s",s+1);
    if(n%2==0)printf("NOT POSSIBLE");return 0;
    int len=(n-1)/2;
    power[0]=1;
    for(int i=1;i<=n;i++)
    
        sum[i]=sum[i-1]*p+s[i]-A;
        power[i]=power[i-1]*p;
    
    ull ans=0,k=0,l=0;
    bool f=1;
//    cout<<sum[4]<<endl;
    for(int i=1;i<=n;i++)
    
        if(i<=len+1)
        
            ull s1=sum[i-1]*power[len-i+1]+(sum[len+1]-sum[i]*power[len-i+1]);
            ull s2=sum[n]-sum[n-len]*power[len];
            if(s1==s2)
            
                ans++;
                if(ans==1)k=s1,l=i;
                else if(k!=s1)f=0;
            
//            cout<<i<<‘ ‘<<s1<<‘ ‘<<s2<<‘ ‘<<ans<<endl;
        
        else
        
            ull s1=sum[len];
            ull s2=(sum[i-1]-sum[len]*power[i-len-1])*power[len*2-i+1]+sum[n]-sum[i]*power[n-i];
            if(s1==s2)
            
                ans++;
                if(ans==1)k=s1,l=i;
                else if(k!=s1)f=0;
            
//            cout<<i<<‘ ‘<<s1<<‘ ‘<<s2<<‘ ‘<<ans<<endl;
        
    
//    cout<<ans<<‘ ‘<<l<<endl;
    if(ans==1||(ans>1&&f))
    
        if(l<=len+1)
            for(int i=n-len+1;i<=n;i++)
                putchar(s[i]);
        else
            for(int i=1;i<=len;i++)
                putchar(s[i]);
    
    else if(ans==0)
        printf("NOT POSSIBLE");
    else printf("NOT UNIQUE");
    return 0;

 

以上是关于三个朋友的主要内容,如果未能解决你的问题,请参考以下文章

多线程:(充分利用定义任务后,开启多线程实现任务的理解)题目:模拟三个老师同时给50个小朋友发苹果,每个老师相当于一个线程。

好朋友同时撩三个妹子,扬言我也可以,我直呼好家伙---我把我偷学来的全都告诉你

我的一个在外资企业工作的朋友想跳槽,但notice period是三个月。他去应聘的公司都不能等他三个月再入职。

微信小程序怎么授权完再转发朋友怎么实现

百度云朋友快传给我的三个文件后缀分别是zip z01 z02 求如何解压?详细点!谢谢!

你男朋友是程序猿吧