传送门

文章目录

  • 题意:
  • 思路:

题意:

给你两个串a,ba,ba,b,让你求对于bbb的每个后缀,设其长度为lenlenlen,其在aaa中出现的次数为cntcntcnt,那么他的贡献为len∗cntlen*cntlen∗cnt,求每个后缀的贡献和是多少。
n≤1e6n\le1e6n≤1e6

思路:

首先我们将a,ba,ba,b都reversereversereverse一下,让后后缀就转换成了前缀。
先考虑如何快速求出来bbb的某个前缀在aaa中出现的次数。首先需要知道我们可以通过dpdpdp快速算出来某个串的一个前缀在当前串出现的次数。那么我们可以将a,ba,ba,b结合起来,分割点加上一个没有出现的字符,比如s=b+′∗′+as=b+'*'+as=b+′∗′+a,这样在sss中求一遍dpdpdp,算出来的是bbb的某个前缀在a,ba,ba,b中出现的次数,再减去在bbb中出现的次数即可。
预处理完上面的数组之后,直接枚举bbb的前缀计算即可。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=4000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;string s,a,b;
int ne[N],f1[N],f2[N];int main()
{ios::sync_with_stdio(false);cin.tie(0);    int _; cin>>_;while(_--) {cin>>a>>b;reverse(a.begin(),a.end()); reverse(b.begin(),b.end());s="1"+b+"*"+a;for(int i=1;i<=s.length();i++) ne[i]=0,f1[i]=f2[i]=1;for(int i=2,j=0;i<s.length();i++) {while(j&&s[i]!=s[j+1]) j=ne[j];if(s[i]==s[j+1]) j++;ne[i]=j;}b="1"+b;for(int i=(int)s.length()-1;i>=1;i--) f1[ne[i]]+=f1[i];for(int i=1;i<=b.length();i++) ne[i]=0;for(int i=2,j=0;i<b.length();i++) {while(j&&b[i]!=b[j+1]) j=ne[j];if(b[i]==b[j+1]) j++;ne[i]=j;}for(int i=(int)b.length()-1;i>=1;i--) f2[ne[i]]+=f2[i];LL ans=0;for(int i=1;i<b.length();i++) ans+=1ll*(f1[i]-f2[i])*i%mod,ans%=mod;printf("%lld\n",ans); }return 0;
}
/**/

hdu 6153 A Secret kmp + dp相关推荐

  1. HDU - 6153 A Secret(KMP的next数组性质/扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串a和b,我们首先定义L:字符串b当前的后缀子字符串长度,N:字符串b当前的后缀在字符串a中出现的次数,现在询问,对于字符串b的每一个后缀,求出L*N之和,答 ...

  2. HDU 5763 Another Meaning KMP+DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 Another Meaning Time Limit: 2000/1000 MS (Java/ ...

  3. HDU - 4552 怪盗基德的挑战书(后缀数组+RMQ/KMP+dp)

    题目链接:点击查看 题目大意:给出一个字符串,统计每个前缀在字符串中出现的次数之和 题目分析:可以直接先用后缀数组跑出来height,再用RMQ跑出来任意两个后缀的height,我们可以将题意转换为求 ...

  4. HDU 1231.最大连续子序列-dp+位置标记

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. HDU 3336 Count the string(KMP+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 题意:给你一个字符串,计算其所有前缀在该字符串出现的次数的总和. 思路:next[j]=i,代表 ...

  6. HDU5763 another meaning -(KMP+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 思路:dp[i]表示前i个字符组成的字符串所表示的意思数量,则当匹配时dp[i]=dp[i-1] ...

  7. HDU 1711 Number Sequence(KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...

  8. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  9. HDU 4652 Dice:期望dp(成环)【错位相减】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意: 给你一个有m个面的骰子. 两种询问: (1)"0 m n": &qu ...

最新文章

  1. 基于ZooKeeper的Hadoop HA集群搭建
  2. 企业网络推广浅析网站首页什么样的布局有利于优化?
  3. 索引的使用—— 验证索引提升查询效率 || 避免索引失效 —— 全值匹配 /最左前缀法则/范围查询右边的列,不能使用索引/不要在索引列上进行运算操作/字符串不加单引号,造成索引失效
  4. Java黑皮书课后题第7章:7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值。编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字
  5. linux下使用sed批量替换关键词(带斜杠处理+kaggle路径批量替换)
  6. Wine 4.3 发布,Windows 应用的兼容层
  7. golang 远程批量执行shell_S2061远程代码执行漏洞复现及批量检测脚本(CVE202017530)...
  8. 苹果官网上架Apple Watch Series 3官翻机:1869元起
  9. linux frame buffer 显示图片 没有颜色,新路程----linux framebuffer显示图片c程序
  10. asp.net在动态网页中的使用技巧
  11. 国产机GSM系列手机常见芯片方案介绍
  12. 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
  13. 简道云-第5章-流程
  14. 在谷歌浏览器上播放rtmp视频的坑
  15. 十大重要IT公司排名 -2009
  16. IntelliJ IDEA自动引入jar包
  17. linux环境oracle环境变量,Linux下设置oracle环境变量
  18. 经典实践 | 网速测速小工具(上)
  19. python3多线程实战(python3经典编程案例)
  20. keil c语言浮点数,Keil MDK浮点数支持不正常的解决方案

热门文章

  1. 编写html要注意,编写XHTML需要注意的问题以及和HTML的区别
  2. 软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?
  3. 无意间看到的浏览器记录......
  4. 嘘!偷偷教你们一个在双十一省钱的办法!
  5. 【资源】机器学习资料包来袭
  6. linux实时进程优先级rt,Linux实时性- PREEMPT_RT实时抢占实现
  7. 正弦波 程序 角度传感器_激光位移传感器的原理及应用领域
  8. c#web服务器 虚拟目录,C#建立自己的Web服务器
  9. 几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...
  10. jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项