题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7

分析 :

有两种做法,如果会拓展KMP的话可以说这就是一道模板题了,拓展KMP专门就是找最长公共前缀的长度,首先将给出的两个字符串双双反转,用模式串去跟主串跑一遍拓展KMP,得到 extend 数组,然后只要遍历一遍 extend 数组,每一个 extend[i] 表示模式串里面前 extend[i] 个前缀都出现过了,因此贡献应该是 1+2+...+extend[i],是等差数列

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
;
;
int next[maxn], extend[maxn], moL, strL;
char mo[maxn], S[maxn];
LL sum[maxn];
void GetNext()
{
    next[] = moL;
    int a, p;
    , j = -; i < moL; i++, j--){
         || i + next[i - a] >= p){
            ) p = i, j = ;

            while (p < moL && mo[p] == mo[j]) p++, j++;

            next[i] = j;
            a = i;
        } else next[i] = next[i - a];
    }
}

void GetExtend()
{
    GetNext();
    int a;
    int p;
    , j = -; i < strL; i++, j--){
         || i + next[i - a] >= p){
            ) p = i, j = ;

            while (p < strL && j < moL && S[p] ==  mo[j])
                p++, j++;

            extend[i] = j;
            a = i;
        } else extend[i] = next[i - a];
    }
}

inline void PrintAns()
{
    GetExtend();
    LL ans = ;
    ; i<strL; i++){
        if(extend[i]){
            LL tmp = extend[i];
            tmp = (tmp+)*tmp/;
            ans = (ans%mod + tmp%mod)%mod;
        }
    }
    printf("%lld\n", ans);
}
int main()
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        scanf("%s %s", S, mo);
        strL = strlen(S);
        moL  = strlen(mo);
        std::reverse(S, S+strL);
        std::reverse(mo, mo+moL);
        PrintAns();
    }
    ;
}

而KMP做法就是用到了NEXT数组的性质,在解决这题之前or后可以看看这道非常相似的题 ==> 51Nod 1277

只要理解了51Nod 1277的kmp+dp解法,这道题直接效仿即可,关于 51Nod 1277 的题解报告点这里 or 百度

#include<bits/stdc++.h>
using namespace std;
;
;
int Next[maxn], moL, strL;
long long d[maxn];
char mo[maxn], str[maxn];
inline void GetNext()
{
    , j = -;
    Next[i] = j;
    while(i < moL){
         && mo[j]!=mo[i]) j = Next[j];
        Next[++i] = ++j;
    }
}
inline void Kmp()
{
    memset(d, , sizeof(d));
    , j = ;
    while(i < strL){
         && mo[j]!=str[i]) j = Next[j];
        i++, j++, d[j]++;
        if(j == moL) j = Next[j];
    }
}
inline void PrintAns()
{
    GetNext(); Kmp();
    ;
    ; i--){
        d[Next[i]] += d[i];
        sum = (sum + d[i]*i) % mod;
    }
    printf("%I64d\n", sum);
}
int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        scanf("%s %s", str, mo);
        moL = strlen(mo);
        strL = strlen(str);
        std::reverse(str, str+strL);
        std::reverse(mo , mo+moL);
        PrintAns();
    }
    ;
}

HDU 6153 A Secret ( KMP&&DP || 拓展KMP )的更多相关文章

  1. hdu-4300(kmp或者拓展kmp)

    题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然 ...

  2. HDU 6153 A Secret(扩展KMP模板题)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total ...

  3. HDU - 4300 Clairewd’s message (拓展kmp)

    HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...

  4. 【kmp或扩展kmp】HDU 6153 A Secret

    acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...

  5. 2017中国大学生程序设计竞赛 - 网络选拔赛 1004 HDU 6153 A Secret (字符串处理 KMP)

    题目链接 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a presen ...

  6. HDU 6153 A Secret(扩展kmp)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  7. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...

  8. HDU 6153 A Secret (KMP)

    题意:给定两个串,求其中一个串 s 的每个后缀在另一个串 t 中出现的次数. 析:首先先把两个串进行反转,这样后缀就成了前缀.然后求出 s 的失配函数,然后在 t 上跑一遍,如果发现不匹配了或者是已经 ...

  9. HDU 6153 A Secret 套路,求解前缀在本串中出现的次数

    http://acm.hdu.edu.cn/showproblem.php?pid=6153 首先相当于翻转两个串,然后求s2前缀在s1中出现的次数. 这是一个套路啦 首先把两个串结合起来,中间加一个 ...

随机推荐

  1. 【MM系列】SAP MM模块-如何修改物料的移动平均价

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-如何修改物料的移动 ...

  2. SIRIM上海,http://www.sirim-global.com

    SIRIM上海 http://www.sirim-global.com

  3. 深入理解java:2.2. 同步锁Synchronized及其实现原理

    同步的基本思想 为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的. 当有第一个线程访问时,就 在锁里保存这个线程的标识 ...

  4. Spring Task 任务调度(定时器)

    1.任务调度SpringTask 1.1什么是任务调度 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的 ...

  5. 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2 (A-C)

    [MtOI2019]黑蚊子多 : 按题意模拟 #include<iostream> #include<cstdio> #include<cstring> using ...

  6. GeoAdapter实现WMS、WMTS、ArcGIS MapService的区域权限授权管理

    背景: 在实际GIS应用中,我们经常会发布GIS地图服务,然后供WebGIS调用.在某些特殊情况下,需要对服务进行区域授权,特定的用户只能够浏览特定范围内的地图数据.通常情况下大家采用的实现方式是使用 ...

  7. [Nest] 01.初见nest.js

    github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...

  8. webstorm 打开后目录结构不完整

    问题: webstorm自动生成的配置文件.idea/modules.xml损坏了,其实是我把这个.idea目录整个删了 解决方法: 1.删除本地目录历史 点击close Project(若是打开多个 ...

  9. styled-components缺点

    缺点 不能用 stylelint 检查你的 Css 代码 在使用 styled-components 的过程中也会遇到一些问题,比如我们的项目会用stylelint来做样式代码的检查,但是使用了 st ...

  10. Android数据库使用指南(上)

    前言Android上的数据库是sqlite,虽然这个数据库是轻量级的,但是储存的东西可不少,sqlite官方表示理论存储容量为140TB,目前应该没有那么大容量的手机,存储能力太强了. 关于如何使用S ...