hdu 6153 思维+扩展kmp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153
扩展kmp不理解的看下:http://www.cnblogs.com/z1141000271/p/7404717.html
大致题意:给定一个a串作为 母串,然后b作为模式串,
f【i】 为b的后缀的长度。
d[i] 为b这个后缀在 a串中出现的次数。。
问你他们的 积是多少,积mod1e9+7
题解:赛后补题目的时候,看到大佬用扩展kmp解,就去看了下扩展kmp,然后把第一个输入的字符串当t,第二个输入的字符串当s,然后卡了一天。
无奈又去看了下大佬的题解,原来是把第二个串当t串,那么怎么解决次数问题呢。我们把两个串倒置一下,用s去匹配t(倒置后)比如 s=aabaaba t=aab 倒置之后 s1=abaabaa
t1=baa。那么extend[1]=3,extend[4]=3。那问题来了,这个求出来有什么用呢?我要求的是t的后缀在s中出现的次数,那倒置之后,是不是如果长度大的出现过了,长度小的一定会出现一次。然后用一个等差公式计数就可以了。。 服气服气。终于补完这道题目了。。。
ac代码(略丑):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define mt(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod=1e9+;
ll extend[];
ll Next[];
ll min(ll x,ll y)
{
if(x>y) return y;
return x;
}
void getNext(string t)
{
mt(Next);
ll len=t.length();
Next[]=len;
ll a,p;
a=;
while( a<len && t[a]==t[a-]) a++;
Next[]=a-;
a=;
for(ll i=;i<len;i++)
{
p=a+Next[a]-;
if((i-)+Next[i-a] < p ) Next[i]=Next[i-a];
else
{
ll j = (p - i + ) > ? (p - i + ) : ;
while(i + j < len && t[i+j] == t[j]) j++;
Next[i]=j;
a=i;
}
}
}
void exkmp(string s,string t) // t->next s->extend
{
getNext(t);
ll a,p;//
ll slen=s.length();
ll tlen=t.length();
a=p=;
ll len=min(s.length(),t.length());
while(p<len && t[p]==s[p]) p++; // after
extend[]=p;
for(ll i=;i<slen;i++)
{
p=a+extend[a]-; // update
if( (i-)+Next[i-a] < p) extend[i]=Next[i-a];
else
{
ll j = (p - i + ) > ? (p - i + ) : ;
while( j < tlen && i+j < slen && s[i + j] == t[j]) j++;
extend[i]=j;
a=i;
}
}
}
int main()
{
string s,t;// s->exkmp t->Next
int Case;
scanf("%d",&Case);
while(Case--)
{
cin>>s>>t;
reverse(s.begin(),s.end());
reverse(t.begin(),t.end());
exkmp(s,t);
ll ans=;
int len=s.size();
for(int i=;i<len;i++)
{
ans=(ans+extend[i]*(extend[i]+1LL)/(2LL))%mod;
}
cout<<ans<<endl;
}
return ;
}
这个包含的关系要理清楚——匹配长度较大的成立,长度小的也成立。
hdu 6153 思维+扩展kmp的更多相关文章
- J - Clairewd’s message HDU - 4300(扩展kmp)
题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
- HDU 6153 A Secret (KMP)
题意:给定两个串,求其中一个串 s 的每个后缀在另一个串 t 中出现的次数. 析:首先先把两个串进行反转,这样后缀就成了前缀.然后求出 s 的失配函数,然后在 t 上跑一遍,如果发现不匹配了或者是已经 ...
- HDU 6153 A Secret(扩展KMP模板题)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
- 【kmp或扩展kmp】HDU 6153 A Secret
acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...
- HDU 6153 扩展kmp
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
随机推荐
- Java 面向对象(十)
常用类之Arrays java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList 返回 ...
- jQuery中ajax如何返回值到上层函数
jQuery中ajax如何返回值到上层函数 一.总结 一句话总结: ajax的同步操作即可,设置 async: false, 二.jquery的同步操作 var can_submit=true; $. ...
- java匿名内部类new(){}
匿名内部类:顾名思义,没有名字的内部类.表面上看起来它们似乎有名字,实际那不是它们的名字.当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象.匿名内部类的声明格式如下:new ...
- wordpress插件开发流程梳理-二
开发插件的最佳实践 避免命名冲突 当您的插件对变量,函数或类使用相同的名称作为另一个插件时,会发生命名冲突. 幸运的是,您可以使用以下方法避免命名冲突. 程序性 默认情况下,所有变量,函数和类都在全局 ...
- ElementUI】日期选择器时间选择范围限制,只能选今天之前的时间,或者是只能选今天之后的时间。今天是否可以选。限制结束日期不能大于开始日期
<el-date-picker v-model="value1" type="date" placeholder="选择日期" :pi ...
- 【集成模型】Bootstrap Aggregating(Bagging)
0 - 思想 如下图所示,Bagging(Bootstrap Aggregating)的基本思想是,从训练数据集中有返回的抽象m次形成m个子数据集(bootstrapping),对于每一个子数据集训练 ...
- Greenwich.SR2版本的Spring Cloud Config+BUS实例
Spring Cloud Config统一的配置中心同注册中心Eureka一样,也分服务端和客户端.服务端用来保存配置信息,客户端用来读取.它的优势是基于Git仓库,支持多环境.多分支配置.动态刷新. ...
- Mongo查询百万级数据性能问题及JAVA优化问题
Mongo查询百万级数据 使用分页 skip和limit 效率会相当慢 那么怎么解决呢 上代码 全部查询数据也会特别慢 Criteria criteria = new Criteria(); ...
- HttpRequest Get和Post调用其他页面的方法
HttpRequest Get和Post调用其他页面的方法,需要的朋友可以参考一下 //Get请求方式 private string RequestGet(string Url) { ...
- 【Leetcode_easy】686. Repeated String Match
problem 686. Repeated String Match solution1: 使用string类的find函数: class Solution { public: int repeate ...