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之正则入门
原文地址 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法 ...
- VS复制文件到输出目录
1.选中项目文件 2. 3.编译时就会自动创建目录,并复制文件
- fastreport报表中出现十字线
问题描述:经常有十字线出现在报表中,出现在报表中不同的频带,在预览和运行时都会显示,不能点击和删除它. 解决方法:这是一个线控制,因太小而不能被渲染,所以fastreport使用十字线来表示其位置.通 ...
- HTML中 等6种空白空格的区别
HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格( )在不同浏览器中宽度各异. 它 ...
- Aircrack-ng介绍
1.介绍 Aircrack-ng主要使用了两种攻击方式进行WEP破解:一种是FMS攻击:一种是KoreK攻击. 2.主要组件 1.aircrack-ng 主要用于WEP及WPA-PSK密码的恢复,主要 ...
- 前端mock数据的几种方式
方式 备注 本地php服务架设 直接输出json 使用在线mock服务 如easyMock.apizza.Rap1\2 , 可以远程协作 本地node服务:koa+mongodb 本地node ...
- EOF \n \0 NULL 之间的区别
\n 是换行符 \0 是字符串的结束标志 EOF是流的结束标志 FILE* 这种流 NULL 是指针为空 第一个问题是EOF 它是end of file的缩写,表示"文字流"(s ...
- 一:对程序员来说CPU是什么?
0.开篇 (1)程序是什么? 指示计算机每一步动作的一组指令 (2)程序是由什么组成的? 指令和数据 (3)什么是机器语言? ...
- CSS :invalid 选择器
如果 input 元素中的值是非法的,实时提醒 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...
- 使用layer 弹出对话框 子父页面相互参数传递 父页面获取子页面参数实例
一.先看效果: 1.点击三个点的图标弹出了子页面: 2.子页面调用父页面方法,图一调用父页面方法,图二得到父页面var变量. 3.选择之后,关闭弹框,父页面得到子页面单选框选择的v ...