poj 3415
对拍没错。。莫名wa了
利用容斥求每个串的重复子串
其实就是找到每个元素能扩展到的最大元素
即(rr-i)*(i-lr)*(w[i]-kk) 就可以了
然后处理这个先离散化再搞
另外是x y要清空
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const ll N=2e5+;
const double pi=acos(-1.0);
ll height[N],rank[N],sa[N],c[N],x[N],y[N],a[N],n,m,kk;
char s[N];
void asa(ll n,ll m)
{
memset(x,,sizeof(x));
memset(y,,sizeof(y));
ll p=,f=;
for (ll i=;i<=m;i++) c[i]=;
for (ll i=;i<=n;i++) c[x[i]=a[i]]++;
for (ll i=;i<=m;i++) c[i]+=c[i-];
for (ll i=n;i;i--) sa[c[x[i]]--]=i;
for(ll i=;i<=n&&p<=n;i<<=)
{
p=;
for (ll j=n-i+;j<=n;j++) y[++p]=j;
for (ll j=;j<=n;j++)
if (sa[j]>i) y[++p]=sa[j]-i;
for (ll j=;j<=m;j++) c[j]=;
for (ll j=;j<=n;j++) c[x[y[j]]]++;
for (ll j=;j<=m;j++) c[j]+=c[j-];
for (ll j=n;j;j--) sa[c[x[y[j]]]--]=y[j];
swap(x,y); x[sa[]]=; p=;
for (ll j=;j<=n;j++)
x[sa[j]]=y[sa[j]]==y[sa[j-]]&&y[sa[j]+i]==y[sa[j-]+i]
?p-:p++;
m=p;
}
for (ll i=;i<=n;i++) rank[sa[i]]=i;
for (ll i=;i<=n;i++)
{
ll j=sa[rank[i]-];
if (f) f--;
while (a[i+f]==a[j+f]) f++;
height[rank[i]]=f;
}
}
struct re{
ll a,b;
};
bool cmp(re x,re y)
{
return(x.a<y.a);
}
ll lr[N],rr[N];
ll get_ans()
{
re a[N],b[N];
for (ll i=;i<=n;i++)
a[i].a=height[i],a[i].b=i;
sort(a+,a++n,cmp);
for (ll i=;i<=n;i++)
b[a[i].b].a=i,b[a[i].b].b=a[i].a;
ll j;
sort(a+,a++n,cmp);
b[].a=-; b[n+].a=-;
for (ll i=;i<=n;i++)
{
j=i-;
while (b[i].a<b[j].a) j=lr[j];
lr[i]=j;
}
for (ll i=n;i>=;i--)
{
j=i+;
while (b[i].a<b[j].a) j=rr[j];
rr[i]=j;
}
ll ans=;
for (ll i=;i<=n;i++)
if (b[i].b>=kk) ans+=(b[i].b-kk+)*(i-lr[i])*(rr[i]-i);
return(ans);
}
string s1,s2,stmp;
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
while (cin>>kk&&kk)
{
cin>>s1>>s2;
string str=s1;
memset(s,,sizeof(s));
strcpy(s,str.c_str());
n=strlen(s);
for (ll i=;i<=n;i++)
a[i]=s[i-]-' ';
ll x1,x2,x3;
asa(n,);
x1=get_ans();
stmp=s2;
memset(s,,sizeof(s));
strcpy(s,stmp.c_str());
n=strlen(s);
for (ll i=;i<=n;i++)
a[i]=s[i-]-' ';
asa(n,); x2=get_ans();
stmp=s1+'%'+s2; memset(s,,sizeof(s));
strcpy(s,stmp.c_str());
n=strlen(s);
for (ll i=;i<=n;i++)
a[i]=s[i-]-' ';
asa(n,);
x3=get_ans();
cout<<x3-x2-x1<<endl;
}
return ;
}
poj 3415的更多相关文章
- POJ 3415 不小于k的公共子串的个数
Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9248 Accepted: 3071 ...
- POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】
传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...
- POJ 3415 (后缀自动机)
POJ 3415 Common Substrings Problem : 给两个串S.T (len <= 10^5), 询问两个串有多少个长度大于等于k的子串(位置不同也算). Solution ...
- POJ - 2774~POJ - 3415 后缀数组求解公共字串问题
POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...
- POJ 3415 Common Substrings(后缀数组 + 单调栈)题解
题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(r ...
- POJ 3415 后缀数组
题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...
- poj 3415 Common Substrings(后缀数组+单调栈)
http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Sub ...
- poj 3415 Common Substrings
题目链接:http://poj.org/problem?id=3415 题目分类:后缀数组 题意:给出两个串和一个数字k,求两个串的公共字串大于等于k的数目 代码: //#include<bit ...
- poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈
题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...
- POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)
http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...
随机推荐
- python多进程那点事儿【multiprocessing库】
前言:项目中有个需求需要对产品的日志处理,按照产品中日志的某些字段,对日志进行再次划分.比如产品的日志中含有字段id,tag=1,现在需要把tag是基数的放到一个文件中,tag是偶数的放入一个文件中. ...
- luogu 1026 统计单词个数
此题 字符串匹配+dp 确实我的kmp,哈希需要练一练了,忘干净可咋办 补救用下string,十分方便 e.g: 1.询问a[i]是否是x子串,可以截取并判断前缀 x为截取串 x.find(a[i]) ...
- L1比L2更稀疏
1. 简单列子: 一个损失函数L与参数x的关系表示为: 则 加上L2正则化,新的损失函数L为:(蓝线) 最优点在黄点处,x的绝对值减少了,但依然非零. 如果加上L1正则化,新的损失函数L为:(粉线) ...
- CF1009E [Intercity Travelling]
这道题先考虑一种暴力n方做法 设\(f_i\)表示到\(i\)点所有情况的困难度之和(\(f_0=0\)),\(pre_i=\sum_{j=1}^{i} a_j\) 考虑从点\(j\)中途不经过休息站 ...
- Pycharm+Anaconda安装及配置
Pycharm是一款功能非常强大的IDE,配合Anaconda使用会非常的方便. 在安装Pycharm之前,我们的电脑上已经安装了Anaconda. 我们从官网下载Pycharm社区版.(https: ...
- G - Preparing for Exams
题目链接: https://vjudge.net/contest/251958#problem/G 具体思路: 圆内四边形内角互补,所以,如图所示. 证明,三角形oda和三角形obc相似. 第一步,角 ...
- I - Interesting Calculator (bfs使用优先队列求步数最小或者花费最小)
题目链接:https://cn.vjudge.net/contest/245287#problem/I 代码: 使用普通的队列和优先队列相比,优先队列能更快地找到目的变量. #include<i ...
- java的一维数组
数组的基础知识: 数组一旦创建,它的的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 初始化数组的方法: 复制数组的方法: 1.使用循环语句逐个地复制数组的元素 2.使用System ...
- POI读取Excel(xls、xlsx均可以)——(四)
maven构建的项目-->pom.xml文件 eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包: ...
- SpringBoot拦截器的注册
(1).编写拦截器 package cn.coreqi.config; import org.springframework.util.StringUtils; import org.springfr ...