题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和。

题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273

思路:先预处理sum[1...n]的值及sum[i]=1+..+i,然后将两个字符串反转,然后用扩展KMP求出翻转后的母串的EX数组。然后对任一个位置的他对答案的贡献就是sum[EX[i]];

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1000005
typedef long long ll;
const int MOD=1e9+;
ll num[maxn];
char s[maxn];
char t[maxn];
int Next[maxn];
int ex[maxn];
void init()
{
num[]=;
for(int i=;i<=maxn;i++)
num[i]=(num[i-]+i)%MOD;
}
void GETNEXT(char *str)
{
int i=,j,po,len=strlen(str);
Next[]=len;
while(str[i]==str[i+]&&i+<len)
i++;
Next[]=i;
po=;
for(i=;i<len;i++)
{
if(Next[i-po]+i<Next[po]+po)
Next[i]=Next[i-po];
else
{
j=Next[po]+po-i;
if(j<)j=;
while(i+j<len&&str[j]==str[j+i])
j++;
Next[i]=j;
po=i;
}
}
}
ll EXKMP(char *s1,char *s2)
{
int i=,j,po,len=strlen(s1),l2=strlen(s2);
GETNEXT(s2);
ll sum=;
while(s1[i]==s2[i]&&i<l2&&i<len)
i++;
ex[]=i;
po=;
sum=(sum+num[ex[]])%MOD;
for(i=;i<len;i++)
{
if(Next[i-po]+i<ex[po]+po)
ex[i]=Next[i-po];
else
{
j=ex[po]+po-i;
if(j<)j=;
while(i+j<len&&j<l2&&s1[j+i]==s2[j])
j++;
ex[i]=j;
po=i;
}
sum=(sum+num[ex[i]])%MOD;
}
return sum;
}
int main()
{
init();
int k;
scanf("%d",&k);
while(k--)
{
scanf("%s%s",s,t);
strrev(s);
strrev(t);
printf("%lld\n",EXKMP(s,t));
}
return ;
}

HDU-6153 A Secret 扩展KMP的更多相关文章

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

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

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

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

  3. HDU 6153 A Secret(扩展kmp)

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

  4. HDU 4333 Revolving Digits 扩展KMP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...

  5. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  6. HDU 4333 Revolving Digits [扩展KMP]【学习笔记】

    题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM乱搞失败 当然要先变SS了 然后考虑每个后缀前长为n个字符,把它跟S比较就行了 如 ...

  7. A - A Secret -扩展KMP

    题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最 ...

  8. 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 ...

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

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

随机推荐

  1. oracle数据库误删的表以及表中记录的恢复

    oracle数据库误删的表以及表中记录的恢复 一.表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: --1.从flash bac ...

  2. Nginx配置跨域支持功能

    跨域是前端开发中经常会遇到的问题,前端调用后台服务时,通常会遇到 No 'Access-Control-Allow-Origin' header is present on the requested ...

  3. Haskell语言学习笔记(93)Data.Text

    Data.Text.Read Prelude> :set -XOverloadedStrings Prelude> :m +Data.Text.Read Prelude Data.Text ...

  4. 【题解】洛谷 P1014 【Cantor表】

    1. 我们先引入三角形数的概念: >定数目的点或圆在等距离的排列下可以形成一个等边三角形,这样的数被称为三角形数. >古希腊著名科学家毕达哥拉斯把数1,3,6,10,15,21……这些数量 ...

  5. Sql Server数据库之触发器

    阅读目录 一:触发器的优点 二:触发器的作用 三:触发器的分类 四:触发器的工作原理 五:创建触发器 六:管理触发器 概念:   触发器(trigger)是SQL server 提供给程序员和数据分析 ...

  6. linux 之用户管理

    用户的家目录 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700 超级用户:/root/,所有者和所属组都是root用户,权限是550 用户邮箱目录 /var/spool/mail ...

  7. python入门(十三):面向对象(继承、重写、公有、私有)

    1. 三种类定义的写法  class P1:#定义类   加不加()都可以    pass   class P2():                    #带(),且括号中为空,类定义 pass ...

  8. XACT_ABORT选项

    XACT_ABORT选项用于指定当SQL语句出现运行时错误时,SQL Server是否自动回滚到当前事务.其语法格式如下所示: SET XACT_ABORT{ON|OFF} 当SET XACT_ABO ...

  9. python将文本写入剪切板

    import pyperclip pyperclip.copy('The text to be copied to the clipboard.') spam = pyperclip.paste() ...

  10. 【c# 数据库】 多表链接

    1.inner join string sql = "select * from studentsinfo inner join teacher on teacher.姓名 = studen ...