对拍没错。。莫名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的更多相关文章

  1. POJ 3415 不小于k的公共子串的个数

    Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9248   Accepted: 3071 ...

  2. POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】

    传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...

  3. POJ 3415 (后缀自动机)

    POJ 3415 Common Substrings Problem : 给两个串S.T (len <= 10^5), 询问两个串有多少个长度大于等于k的子串(位置不同也算). Solution ...

  4. POJ - 2774~POJ - 3415 后缀数组求解公共字串问题

    POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...

  5. POJ 3415 Common Substrings(后缀数组 + 单调栈)题解

    题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(r ...

  6. POJ 3415 后缀数组

    题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...

  7. poj 3415 Common Substrings(后缀数组+单调栈)

    http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Sub ...

  8. poj 3415 Common Substrings

    题目链接:http://poj.org/problem?id=3415 题目分类:后缀数组 题意:给出两个串和一个数字k,求两个串的公共字串大于等于k的数目 代码: //#include<bit ...

  9. poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...

  10. POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)

    http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...

随机推荐

  1. vue自学入门-2(vue创建项目)

    本人也是刚学习VUE,边找资料,边学习,边给大家分享.1.创建项目 2.启动项目 3.注意上面和下面全部用cnpm

  2. dp题

    1.luogu 1484种树 50分思路:dp,但是数据规模过大没法dp选择奇怪贪心 dp方程 到i坑种j树 dp[i][j]=max(dp[i-1][j],dp[i-2][j-1]) 100分思路: ...

  3. zabbix 源码分析 another/first network error wait for 15s seconds 出现原因及调优建议

    在监控设备的时候,在server端的日志中有时候会见到类似another network error, wait for 15s seconds的异常,今天我们看下这个问题的出现原因和解决方案: 问题 ...

  4. jira7.3.6添加导出excel的按钮

    在 jira的application-data 文件夹下 jira-config.properties 文件(如果没有就创建一个) 中添加以下内容:jira.export.excel.enabled= ...

  5. G - Preparing for Exams

    题目链接: https://vjudge.net/contest/251958#problem/G 具体思路: 圆内四边形内角互补,所以,如图所示. 证明,三角形oda和三角形obc相似. 第一步,角 ...

  6. JavaScript学习 - 基础(五) - string/array/function/windows对象

    String对象 更详细转:http://www.w3school.com.cn/jsref/jsref_obj_string.asp //------------------------------ ...

  7. adb shell dumpsys meminfo [packagename] 输出内容的含义

    Private Dirty:私有的脏内存页(还在使用中)的大小:   Private Clean:私有的干净内存页(现在未使用了)的大小: 以上这二者相加,便是应用曾经申请过的内存空间大小.Priva ...

  8. Udacity并行计算课程 CS344 编程作业答案

    Problem set 1 // Homework 1 // Color to Greyscale Conversion //A common way to represent color image ...

  9. Struts自定义拦截器&拦截器工作原理

    0.拦截器的调用原理: 拦截器是一个继承了序列化接口的普通接口.其工作原理是讲需要被拦截的对象作为参数传到intercept()方法内,在方法内部对此对象进行处理之后再执行原方法.intercept( ...

  10. Python之matplotlib库学习

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...