CF494B Obsessive String 题解(KMP/HASH+DP)

本文深入探讨了一道关于字符串匹配的问题,通过KMP算法和哈希方法定位子串,并运用动态规划计算满足条件的子串数量。文章详细介绍了算法流程及核心数据结构,为读者提供了清晰的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说明一下本题的题意,因为题目太难读了。。。题目大意:给出两个字符串,

求有多少个字符串,包含二串,且为一串的子串,而且互相不重叠,解释一下样例。

一串:ddd

二串:d

这里将一串的ddd分别标号为123

答案为:1 , 2, 3, 12 3 ,1 23 , 123 ,1 2,2 3,1 3 ,12 ,23 ,1 2 3。

看到这应该有一些思路了吧,这道题支持两种算法。但是目的是一样的。

用kmp匹配二串在一串中完全成功匹配的位置,设这个位置为flag[i] = 1。

这个会kmp应该不用说了吧,hash的话可以直接判断s1[i-l2+1] == s2时进行操作

至于dp,先介绍一下各数组的含义,f代表以目标串s2为结尾的串的个数,

sum1为f的前缀和,sum2为sum1的前缀和

如果这个位为结尾时没有匹配那么直接f[i] = f[i-1],把这个值传下去。

那么如果i位为结尾时匹配到s2,f[i] = sum2[i-l2]+i-l2+1.

因为以这个这个位为结尾是包含二串的串的开头可以从1~i-l2+1,所以一共有i-l2+1种方案

是只有一个包含这个二串的串的。

而如果有多个呢。

我们可以感性yy一下,当前串起点为2~i-l2+1时,上一个和他组合的串的结尾可以为1~i-l2

如果上一个串终点为k,那么1~k都可以和当前串组合。这就是sum1的含义

因为结尾为1~i-l2,所以sum2为sum1的合

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mode 1000000007
#define seed 13131
using namespace std;
typedef long long ll;
char s1[100005];
char s2[100005];
unsigned long long p1[100005];
unsigned long long ss1[100005];
unsigned long long ss2;
ll f[100005];
ll sum1[100005];
ll sum2[100005];
int main()
{
    scanf("%s",s1+1);
    scanf("%s",s2+1);
    int l1 = strlen(s1+1),l2 = strlen(s2+1);
    p1[0] = 1;
    for(int i = 1;i <= l1;i++)
    {
        p1[i] = p1[i-1]*seed;
        ss1[i] = ss1[i-1]*seed+s1[i]-'a'+1;
    }
    for(int i = 1;i <= l2;i++)
    {
        ss2 = ss2*seed+s2[i]-'a'+1;
    }
    for(int i = 1;i <= l1;i++)
    {
        if(i-l2+1 >= 1)
        {
            if(ss1[i]-p1[l2]*ss1[i-l2] == ss2)
            {
                f[i] = sum2[i-l2]+i-l2+1;
                f[i] %= mode;
            }else
            {
                f[i] = f[i-1];
            }
            sum1[i] = sum1[i-1]+f[i];
            sum2[i] = sum2[i-1]+sum1[i];
        }
    }
    ll ans = 0;
    for(int i = 1;i <= l1;i++)
    {
        ans += f[i];
        ans %= mode;
    }
    printf("%lld",ans);
    return 0;
}
<think>好的,用户让我翻译一些社交媒体上的俚语成英文。先看看每个词的具体意思和用法,再找合适的对应英文。 首先是“磕cp”。这个词指的是粉丝们非常喜欢某个虚构的情侣配对,可能来自电视剧、电影或者其他媒体。在英文里,"ship"这个词就是用来表示支持情侣关系的,比如“shipping a couple”。所以翻译成“ship/shipping a couple”比较合适,或者更详细一点“obsessively support a fictional couple”。 接下来是“私生饭”。这个是指那些过度痴迷,甚至侵犯偶像隐私的粉丝。英文中有“sasaeng fan”,这个词来自韩语,已经被广泛使用,特别是在K-pop圈子里。所以直接用“sasaeng fan”可能更准确,或者解释为“obsessive fan who invades privacy”。 第三个是“xsw1”。看起来是拼音缩写,比如“笑死我了”,也就是“laughing to death”或者“LOL”。在英文里,常用的是“LOL”或者“ROFL”,所以翻译成“LOL (laughing out loud)”比较合适。 然后是“集美”。这是“姐妹”的谐音,用来称呼亲密的朋友或姐妹,带有亲切感。英文中可以用“sisters”或者“besties”,根据语境选择更口语化的词,比如“besties”更贴近朋友间的称呼。 最后是“梗图”。指的是带有流行文化梗的图片,英文里常用“meme”这个词,所以直接翻译成“meme”就可以了,或者更详细点“meme image”。 需要检查每个翻译是否准确传达了原词的含义,特别是文化背景。比如“私生饭”用“sasaeng fan”可能更准确,因为这个词在英语中已经有特定含义。而“磕cp”的“ship”也是常见的用法,可能需要稍作解释。确保用户理解这些翻译可能需要上下文,所以提供两种形式:直接对应和解释性翻译会更清晰。以下是</think>这些社交媒体俚语的英文翻译及解释: 1. **磕cp** - **直译**: _Ship/shipping a couple_ - **解释**: Obsessively support a fictional romantic pairing (from dramas, books, etc.). - 例:他们在疯狂"磕cp" → "They're hardcore shipping that couple." 2. **私生饭** - **直译**: _Sasaeng fan_ (源自韩娱的全球通用词) - **解释**: An extreme fan who stalks idols, invades their privacy. - 例:私生饭行为很危险 → "Sasaeng fan behavior is dangerous." 3. **xswl** - **拼音缩写梗**: _LOL/ROFL_ - **原意**: "笑死我了"(拼音首字母缩写,意为"笑到不行") - 例:这图xswl → "This pic is ROFL." 4. **集美** - **直译**: _Sisters/Besties_ - **解释**: 谐音梗,原为"姐妹",用于亲密称呼女性朋友 - 例:集美们冲! → "Let's go, besties!" 5. **梗图** - **直译**: _Meme_ - **解释**: 结合流行文化梗的搞笑图片 - 例:分享一张新梗图 → "Sharing a fresh meme." **注**:部分词汇(如"私生饭")因文化特殊性,英文直接使用原词(如韩语借词"sasaeng")更易被理解;"梗图"对应英语成熟概念"meme",无需直译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值