对拍没错。。莫名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. android 插件合集

    1.增加编译速度:fastdex-plugin 2.gradle 版本网站http://services.gradle.org/distributions/

  2. maven打包子模块中的class文件

    通常在项目中都会使用maven进行多模块管理,默认被依赖的模块都会以jar包形式被引用.然而在J2EE项目中,当使用了Spring的自动扫描配置时,jar包形式的依赖class将不能被自动装配:< ...

  3. 数据库的一致性读,赃读,多线程与赃读,ACID,UNDO

    赃读 对于对象额同步异步方法,我们在设计自己的程序的时候,一定要考虑的问题整体,不然会出现数据不一致的错误,很经典的就是赃读(dityread) 示例: ​ package com.nbkj.thre ...

  4. java实现网页验证码

    Servlet: package cn.bdqn.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletExceptio ...

  5. MacOs -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

    1解决iterm远程登录主机报错 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or ...

  6. PHP二叉树

    <?php /******************************************************** * 我写的PHP都是从C语言的数据结构中演化而来********* ...

  7. Linux mmc framework1:软件架构

    [部分内容来自] http://www.wowotech.net/comm/mmc_framework_arch.html 1. 前言 由eMMC基础技术1:MMC简介中MMC.SD.SDIO的介绍可 ...

  8. 【Connection Events】【BLE】【原创】

    Connection Events  本人在TI官网的学习笔记,现整理如下   两台BLE设备建立连接后,所有的通信事件都是通过Connection Events中发生的           上图为两 ...

  9. Gitlab的SSH配置(linux和windows双版本)

    1. 步骤 1.首先现在电脑端安装好git,windows端请安装Git for Windows,Linux端请自行网上查询(Ubuntu: sudo apt-get install git)   2 ...

  10. python之比较is与==(转载)

    在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过: ...