首页 > 编程语言 >2024“钉耙编程”中国大学生算法设计超级联赛(1)第一场1001

2024“钉耙编程”中国大学生算法设计超级联赛(1)第一场1001

时间:2024-07-22 22:56:14浏览次数:10  
标签:钉耙 mod2 int sum 2024 size ll 1001 mod

循环位移题解

2024“钉耙编程”中国大学生算法设计超级联赛(1)

题目:

Problem Description

定义字符串 S=S0+⋯+Sn−1 循环位移 k 次为 S(k)=Skmodn+⋯+Sn−1+S0+⋯+S(k−1)modn。

定义 [A]=\setA(k),k∈N.

给出 T 组串 A,B,询问 B 有多少个子串在 [A] 中。

Input

第一行一个 T 表示输入组数。

接下来每行两个字符串,表示 A 和 B,保证 |A|≤|B|。

保证 ∑|B|≤1048576.,并且字符串均由大写字母组成。

Output

输出 T 行,每行一个数表示答案。

Sample Input

3
AN MANTLEFAN
MVP XPTIJMVPMVP
CJMR JDRCJMRAJMRCJMGC

Sample Output

2
4
5

Hint:

第一个样例:MANTLEFAN,MANTLEFAN第三个样例:JDRCJMRAJMRCJMGC,JDRCJMRAJMRCJMGC,JDRCJMRAJMRCJMGC,JDRCJMRAJMRCJMGC,JDRCJMRAJMRCJMGC


先考虑到将A所有情况放入map中接着将b中所有长度等于A的字符串拿出来查找:

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define mod 
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t;
    unordered_map<string,bool>check;
    cin>>t;
    while(t--)
    {
        string a,b;
        cin>>a>>b;
        string fr,be;
        for(int i=0;i<a.size();i++)
        {
            fr=a.substr(0,i);
            be=a.substr(i,a.size()-i);
            check[be+fr]=true;
        }
        int ans=0;
        for(int i=0;i+a.size()-1<b.size();i++)
        {
            if(check[b.substr(i,a.size())])
            {
                ans++;
                check.erase(b.substr(i,a.size()));
            }
        }
    }
    return 0;
}

发现MLE了


考虑用字符串哈希进行优化,暴力计算字符串对应的值会发现时间复杂度过高,交了一发超时了
通过字符串前缀和进行优化,但优化完会发现数据卡了经典模数的哈希碰撞,有重复值产生
解决方案 { 尝试不同模数 双哈希 解决方案 \begin{cases} 尝试不同模数\\ 双哈希 \end{cases} 解决方案{尝试不同模数双哈希​
队友交了一发模数99999999过了
或者用双哈希减少碰撞几率,即双重验证,对两个不同的数取模,只有同时相等才视作相等

AC代码

#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
#define ull unsigned long long
#define mod (1610612741)
#define mod2 (163227661)

ll fastpow(ll a, ll b) {
    ll sum = 1;
    while (b) {
        if (b & 1) {
            sum = sum * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return sum;
}
ll fastpow2(ll a, ll b) {
    ll sum = 1;
    while (b) {
        if (b & 1) {
            sum = sum * a % mod2;
        }
        a = a * a % mod2;
        b >>= 1;
    }
    return sum;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t;
    unordered_map<ll,bool>check;
    unordered_map<ll,bool>check2;
    cin>>t;
    while(t--)
    {
        int ans=0;
        string a,b;
        cin>>a>>b;
        vector<ll>sum(a.size());
        vector<ll>sum2(a.size());
        sum2[0]=sum[0]=(ll)a[0];
        ll key=0,key2=0;
        for(int i=1;i<a.size();i++)
        {
            sum[i]=((sum[i-1]*127)%mod+a[i])%mod;
            sum2[i]=((sum2[i-1]*127)%mod2+a[i])%mod2;
        }
        for(int i=0;i<a.size();i++)
        {
            //190089->190 089->089 190(sum[i])->089=190089-190000(sum[size]-sum[i]*127^089.size()
            check[((sum[a.size()-1]-sum[i]* fastpow(127,a.size()-1-i)%mod+mod)%mod*fastpow(127,1+i)+sum[i])%mod]=true;
            check2[((sum2[a.size()-1]-sum2[i]* fastpow2(127,a.size()-1-i)%mod2+mod2)%mod2*fastpow2(127,1+i)+sum2[i])%mod2]=true;
        }

        vector<ll>sumb(b.size());
        vector<ll>sumb2(b.size());
        sumb[0]=(ll)b[0];
        sumb2[0]=(ll)b[0];
        for(int i=1;i<b.size();i++)
        {
            sumb[i]=((sumb[i-1]*127)%mod+b[i])%mod;
            sumb2[i]=((sumb2[i-1]*127)%mod2+b[i])%mod2;

        }
        key=sumb[a.size()-1];
        key2=sumb2[a.size()-1];
        if(check[key]&&check2[key2])ans++;
        for(int i=0;i+a.size()<b.size();i++)
        {
            key2=(sumb2[i+a.size()]-(sumb2[i]* fastpow2(127,a.size()))%mod2+mod2)%mod2;
            key=(sumb[i+a.size()]-(sumb[i]* fastpow(127,a.size()))%mod+mod)%mod;
            if(check[key]&&check2[key2])ans++;
        }
        cout<<ans<<"\n";
    }

    return 0;
}

标签:钉耙,mod2,int,sum,2024,size,ll,1001,mod
From: https://blog.csdn.net/2301_79937391/article/details/140621475

相关文章

  • USACO 2024Feb Silver
    https://usaco.org/index.php?page=feb24results话说usaco赛后怎么看成绩啊。为啥submission只有代码没有评测结果T3交了巨大多次才过T2胡了个做法,讨论不清楚,感觉很对,WA了T1啥都想不出来打一半弃考了。很烦,下午要去上学了467pts,750晋级,乐子大了LG10190[USACO24......
  • 2024牛客暑期多校训练营2(部分题目题解)
    2024牛客暑期多校训练营2(部分题目题解)C.RedWalkingonGrid题意:给定只有红白的2*n个格子,只能走红色各自且只能上下左右走,问最多可以走多少红色格子。题解:左右走:dp[0][i]=dp[0][i-1]+1;上下走:intk1=dp[0][i];intk2=dp[1][i];dp[0][i]=max(dp[0][i],k2+......
  • 2024杭电钉耙2-1003 HDOJ7447 绝对不模拟的简单魔方
    欢迎您来我的网站看这篇题解!Problem有一个魔方可能被拧了不超过三次,同时还弄丢了一个角块上的两个贴纸。现在把这两个贴纸贴回去,请问有没有贴错?只可能拧侧面,不会拧中间层,且每次只能拧\(90^\circ\)。魔方用一个9行12列的字符型矩阵表示:初始魔方的展开图如下图:\(1\leT......
  • AIGC-DynamiCrafter: Animating Open-domain Images with Video Diffusion Priors-ECC
    论文:https://arxiv.org/pdf/2310.12190代码:https://github.com/Doubiiu/DynamiCrafter?tab=readme-ov-fileMOTIVATIONTraditionalimageanimationtechniquesmainlyfocusonanimatingnaturalsceneswithstochasticdynamics(e.g.cloudsandfluid)ordom......
  • 2024年Java高级开发工程师面试准备
    20240722前三步因为是在20年找工作的时候已经充分学习过,所以现在基本只需要读一遍即可第一步:Java基础(CYC2018[2.1-2.4]+JavaGuide[第二章])Java基础+JVM+多线程+Java集合第二步:计算机基础(算法和设计模式靠积累,计算机网络和操作系统读一遍:CYC2018[3.1-3.2]+JavaGuide[......
  • 20240722题解
    孩子们,我回来了......
  • NOI 2024 游记
    NOI2024游记Day(-4)~(-2)UOJ模拟给大家整了个活,笔试100,Day1Day2两天各两题,过题数成功达到全场rk2水平。没写暴力,反正暴力也是随便写写,两题100多分的暴力也都是纯唐。Day0抵达酒店酒店很不错,但是不禁让我担心起了学校的住宿环境。Day1抵达学校学校宿舍疑似唐......
  • 2024牛客暑期多校训练营2
    2024牛客暑期多校训练营2E-GCDVSXOR_2024牛客暑期多校训练营2(nowcoder.com)题意给定x,构造y<x使得gcd(x,y)=x⊕y思路取x−lowbit(x)即可,如果x是2的整数次幂则无解。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voi......
  • 闲话:IMO 2024 P5
    这道题其实挺搞心态的,至少看到\(2024\)这种具体的数字一般都会想到\(12,13\)之类的东西上去吧?当然这几天知乎看饱了都知道答案是\(3\)了。下面给一下我的构造:第一步从\((1,1)\)走到\((2,1)\),然后一路往右插过去,问出第二行的鬼的位置,位于\((2,x)\)。如果这个鬼不在......
  • SMU Summer 2024 Contest Round 6
    AManyFormulas思路:二进制枚举voidsolve(){strings;cin>>s;intn=s.size();intm=pow(2,n-1);intans=0;for(inti=0;i<m;++i){intnow=0,sum=0;for(intj=0;j<n;++j){......