博客
关于我
2021牛客寒假第四场 武辰延的字符串(二分+哈希)
阅读量:624 次
发布时间:2019-03-12

本文共 2021 字,大约阅读时间需要 6 分钟。

题目链接:

题目大意:

给出两个字符串 s s s t t t ,求有多少对 s s s 的非空前缀连起来是 t t t 的前缀

题目分析:

我们可以先枚举 t t t 的每一个位置
如果 s [ i ] ≠ t [ i ] s[i]\not=t[i] s[i]=t[i] 显然用 s s s 的前 i i i 个字符不可能凑成 t t t 的一个子串(因为 s [ i ] s[i] s[i] t [ i ] t[i] t[i] 不同)
如果 s [ i ] = t [ i ] s[i]=t[i] s[i]=t[i] 我们可以二分来找用 s . s u b s t r ( 1 , i ) s.substr(1,i) s.substr(1,i) 和其子串能构成 t t t 的子串的方案数,具体方法如下:
i i i s s s t t t 相同,之后再用哈希判断 s . s u b s t r ( 1 , i ) s.substr(1,i) s.substr(1,i) 的子串是否可以继续匹配,此题我使用了双哈希

具体细节见代码:

#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define ull unsigned ll#define inf 0x3f3f3f3f#define Inf 0x3f3f3f3f3f3f3f3f//#define int llusing namespace std;int read(){ int res = 0,flag = 1; char ch = getchar(); while(ch<'0' || ch>'9') { if(ch == '-') flag = -1; ch = getchar(); } while(ch>='0' && ch<='9') { res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0'; ch = getchar(); } return res*flag;}const int maxn = 1e5+5;const int mod = 1e9+7;const double pi = acos(-1);const double eps = 1e-8;const int base = 131;const int base2 = 233;int n,m,a[maxn<<2];char s[maxn],t[maxn];ull sum1[maxn],sum2[maxn],pre1[maxn],pre2[maxn],p[maxn],p2[maxn];pair
get_hash(int l,int r,ull a[],ull b[]){ return make_pair(a[r]-a[l-1]*p[r-l+1],(b[r]-b[l-1]*p2[r-l+1]%mod+mod)%mod);}signed main(){ scanf("%s%s",s+1,t+1); int len1 = strlen(s+1),len2 = strlen(t+1); p[0] = 1,p2[0] = 1; for(int i = 1;i <= max(len1,len2);i++) p[i] = p[i-1]*base,p2[i] = p2[i-1]*base2%mod; for(int i = 1;i <= len1;i++) sum1[i] = sum1[i-1]*base+s[i],pre1[i] = (pre1[i-1]*base2+s[i])%mod; for(int i = 1;i <= len2;i++) sum2[i] = sum2[i-1]*base+t[i],pre2[i] = (pre2[i-1]*base2+t[i])%mod; ll ans = 0; for(int i = 1;i <= min(len1,len2-1);i++) { if(s[i] != t[i]) break; int l = 0,r = len2-i,res = 0; while(r-l >= 0) { int mid = l+r>>1; if(get_hash(1,mid,sum1,pre1) == get_hash(i+1,i+mid,sum2,pre2)) l = mid+1,res = mid; else r = mid-1; } ans += res; } printf("%lld\n",ans); return 0;}

转载地址:http://frrxz.baihongyu.com/

你可能感兴趣的文章
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>
MySQL 的存储引擎有哪些?为什么常用InnoDB?
查看>>
Mysql 知识回顾总结-索引
查看>>