题目大意:
给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少。
题解:
扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最长公共前缀存于数组。
最后通过将数组的值不为0的进行一个桶计数,倒着进行一下求和就可以了。注意,在这个题目上扩展kmp处理出来的是
ex[ i ]数组是 A串的每个从 i 位置开始的后缀 ,与B串的最长公共前缀长度,那么这样B串在A串上匹配的情况就一目了然了。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int N = 1000005;
int Next[N];
long long ex[N],tong[N]; //即extand[]
char p[N],t[N];
int T;
long long ans;
void pre()   // next[i]: 以第i位置开始的子串 与 T的公共前缀
{int lp=strlen(p);Next[0]=lp;int j=0,k=1;while(j+1<lp && p[j]==p[j+1]) j++;Next[1]=j;for(int i=2; i<lp; i++){int P=Next[k]+k-1;int L=Next[i-k];if(i+L<P+1) Next[i]=L;else{j=max(0,P-i+1);while(i+j<lp && p[i+j]==p[j]) j++;  // 枚举(p+1,length) 与(p-k+1,length) 区间比较Next[i]=j;k=i;}}
}
void exkmp()
{int lp=strlen(p),lt=strlen(t);pre();  //next数组初始化int j=0,k=0;while(j<lt && j<lp && p[j]==t[j]) j++;ex[0]=j;for(int i=1; i<lt; i++){int P=ex[k]+k-1;int L=Next[i-k];if(i+L<P+1) ex[i]=L;else{j=max(0,P-i+1);while(i+j<lt && j<lp && t[i+j]==p[j]) j++;ex[i]=j;k=i;}}
}
int main()
{scanf("%d",&T);while(T--){memset(tong,0,sizeof(tong));scanf("%s%s",&t,&p);int lt=strlen(t);int lp=strlen(p);reverse(p,p+lp);reverse(t,t+lt);exkmp();ans=0;for(int i=0; i<lt; i++)tong[ex[i]]++;for(int i=lp;i;i--){tong[i]=(tong[i]+tong[i+1])%mod;ans=(ans+tong[i]*i%mod)%mod;}printf("%lld\n",ans);}
}

  

转载于:https://www.cnblogs.com/SDUTNING/p/10388792.html

A - A Secret -扩展KMP相关推荐

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

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

  2. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  3. 嫦娥奔月(KMP,找循环节)及其扩展KMP

    问题描述 <归妹>卦辞为:昔者恒我(姮娥)窃毋死之药于西王母,服之以(奔)月.将往,而枚占于有黄.有黄占之曰:"吉.翩翩归妹,独将西行.逢天晦芒,毋惊毋恐,后且大昌". ...

  4. hdu3613(扩展KMP)

    用kmp的方法写了好久,发现以我的想法用kmp不仅难以实现而且无法证明正确性. 于是还是使用扩展kmp... Best Reward Time Limit: 2000/1000 MS (Java/Ot ...

  5. HDU 3613 Best Reward 正反两次扩展KMP

    题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...

  6. HDU - 4333 Revolving Digits(扩展KMP)

    题目链接:点击查看 题目大意:给出一个由 n 个数位组成的数字,现在可以通过将其不同的后缀移到前面来组成 n 个新的数字,现在要求出 n 个新数字进行去重后,有多少个新数字分别大于.等于.小于原数字 ...

  7. HDU - 4300 Clairewd’s message(扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串 s 和 t ,字符串 s 代表着一种密码的映射,字符串 t 代表着一段密文+明文,题目保证密文是完整的,但明文只有一部分,现在问如何补全字符串 t ,使得 ...

  8. HDU - 6629 string matching(扩展KMP)

    题目链接:点击查看 题目大意:给出一个字符串 s 和一个暴力程序,用于求解 s 的每个后缀和原字符串的最长公共前缀,现在问一共需要执行多少次比较操作 题目分析:首先肯定不能暴力去模拟,时间复杂度n*n ...

  9. UVA5876 Writings on the Wall 扩展KMP

    扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; ...

最新文章

  1. 变速后没有声音_CVT不仅平顺省油还是运动型变速箱?
  2. python编程主要干嘛的-让孩子学了Python编程有什么用
  3. taglib遍历foreach循环list集合
  4. 1050 循环数组最大子段和
  5. scanf 接收 空格 输入_当接受用户输入的含有空格的字符串时,应使用()函数。...
  6. leetcode 之Remove Nth Node From End of List(19)
  7. myeclipse5.5注册码
  8. 软件工程博客---团队项目---个人设计2(算法)
  9. 测试助手健康 Test-AssistantHealth failed for server
  10. 计算机英语拼读法,常用计算机英语词汇:CPU
  11. php色子,jQuery+PHP实现的掷色子抽奖游戏实例,jquery色子_PHP教程
  12. 笔记本电脑开机白屏怎么处理
  13. 凯西与拜耳将在中国共同推广呼吸药物宝丽亚和启尔畅
  14. 强化学习(Reinforcement Learning)
  15. css 超出添加滚动条并隐藏滚动条
  16. 如何用AR Engine开发一个虚拟形象表情包?
  17. 软考信息系统项目管理师论质量管理范文
  18. 说话人确认系统性能评价指标
  19. CSS3霓虹灯文字特效
  20. Chrome版本与chromedriver兼容版本对照表

热门文章

  1. unity3d collider自动调整大小_Maya模型在Unity3d中的快速烘焙【2020】
  2. java的decode_Java decode机试题
  3. 计算机电子琴弹奏怎么打开,怎么打开电脑键盘电子琴软件
  4. 用python写linux中的ls,Python实现Linux环境下的ls命令
  5. mysql可连接_mysql开启远程可连接
  6. 如何从零开始开发一个 Chrome 插件?
  7. 【SSH高速进阶】——struts2简单的实例
  8. 电信运营商x86服务器定制策略
  9. MAVEN集成测试环境搭建
  10. 加快Android Studio的编译速度