poj 3415 后缀数组+单调队列

YOLOv8猫狗品种识别系统:从环境配置到模型部署完整指南 目标检测作为计算机视觉的核心技术,通过深度学习算法实现对图像中特定物体的定位与识别。其原理基于卷积神经网络提取特征,结合边界框回归和分类器完成检测任务。在技术价值层面,目标检测为智能监控、自动驾驶、工业质检等领域提供了关键能力支撑。特别是在宠物识别、动物管理等应用场景中,基于YOLOv8的检测系统展现出显著优势。YOLOv8作为最新的实时检测框架,在精度和速度方面都有显著提升,配合GPU加速技术能够实现高效的推理性能。本文以猫狗品种识别为具体案例,详细解析如何利用预训练模型和完整源码快速构建实用的目标检测系 阅读详情

Common Substrings
Time Limit: 5000MS Memory Limit: 65536K
Total Submissions: 8106 Accepted: 2688

Description

A substring of a string T is defined as:

T( i, k)= TiTi +1... Ti+k -1, 1≤ i≤ i+k-1≤| T|.

Given two strings A, B and one integer K, we define S, a set of triples (i, j, k):

S = {( i, j, k) | k≥ K, A( i, k)= B( j, k)}.

You are to give the value of |S| for specific A, B and K.

Input

The input file contains several blocks of data. For each block, the first line contains one integer K, followed by two lines containing strings A and B, respectively. The input file is ended by K=0.

1 ≤ |A|, |B| ≤ 105
1 ≤ K ≤ min{|A|, |B|}
Characters of A and B are all Latin letters.

Output

For each case, output an integer |S|.

Sample Input

2
aababaa
abaabaa
1
xx
xx
0

Sample Output

22
5

Source

POJ Monthly--2007.10.06, wintokk


题意是求两个字符串长度>=K的公共子串有多少个。
先考虑怎么求解公共子串的问题。公共子串可以用后缀数组求,将两个字符串str1和str2合并为一个字符串,中间插入一个不会出现的字符做分割。得到后缀数组和高度数组,有了高度数组就可以求出任意两个后缀的lcp最长公共前缀值,lcp即为两个后缀之间height[i]的最小值。
回到这个问题上,假如两个分别属于str1和str2的后缀lcp为X (X>K), 那么就计数X-K+1个长度>=K的公共子串。那么答案就是每个属于str1和每个属于str2的lcp-K+1求和。
直接枚举要n^2logn复杂度(单次查询两个后缀lcp用rmq--logn复杂度)。任意两个后缀的lcp值取决于它们之间的最小值,直接枚举慢就慢在每两个后缀都要找一遍它们之间的最小值。利用最小值这个关键点,假如枚举以第i个lcp值为最小值的区间[l,r],那么ans+=(左边属于str1的后缀个数*右边属于str2+左边属于str2*右边属于str1)*(lcp-K+1)。而找到以某个值为最小值的区间用单调队列左右扫一遍O(n)就可以得到。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int maxn=200005;
int t1[maxn], t2[maxn], c[maxn];
bool cmp(int *r, int a, int b, int l)
{
    return r[a]==r[b]&&r[a+l]==r[b+l];
}

void da(int str[], int sa[], int rank[], int height[], int n, int m)
{
    n++;
    int i,j,p,*x=t1, *y=t2;
    for(i=0; i<m; i++) c[i]=0;
    for(i=0; i<n; i++) c[x[i]=str[i]]++;
    for(i=1; i<m; i++) c[i]+=c[i-1];
    for(i=n-1; i>=0; i--) sa[--c[x[i]]]=i;
    for(j=1; j<=n; j<<=1){
        p=0;
        for(i=n-j; i<n; i++) y[p++]=i;
        for(i=0; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;

        for(i=0; i<m; i++) c[i]=0;
        for(i=0; i<n; i++) c[x[y[i]]]++;
        for(i=1; i<m; i++) c[i]+=c[i-1];
        for(i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i];
        swap(x,y);
        p=1;x[sa[0]]=0;
        for(i=1; i<n; i++)
            x[sa[i]]=cmp(y, sa[i-1], sa[i], j)?p-1:p++;
        if(p>=n) break;
        m=p;
    }
    int k=0;
    n--;
    for(i=0; i<=n; i++) rank[sa[i]]=i;
    for(i=0; i<n; i++){
        if(k)k--;
        j=sa[rank[i]-1];
        while(str[i+k]==str[j+k]) k++;
        height[rank[i]]=k;
    }
}
int n;
int rank[maxn], height[maxn];
char s[maxn];
int r[maxn];
int sa[maxn];

int que[maxn], head,tail;
int lb[maxn], rb[maxn];

int sum[maxn]={0};
int query(int l, int r)
{
    return sum[r]-sum[l-1];
}

int main()
{
    int K;
    while(scanf("%d", &K)==1 &&K){
        scanf("%s", s);
        int len=strlen(s);
        for(int i=0; i<len; i++) {r[i]=s[i];}
        scanf("%s", s);
        int len1=strlen(s);
        for(int i=0; i<len1; i++) r[len+1+i]=s[i];
        n=len+1+len1;
        r[len]=1;
        r[n]=0;
        da(r,sa,rank, height, n,128);

        head=0,tail=-1;
        for(int i=1; i<=n; i++){
            while(tail+1!=head && height[que[tail]]>height[i]) tail--;
            if(tail+1!=head) lb[i]=que[tail]+1;
            else lb[i]=1;
            que[++tail]=i;
        }
        head=0, tail=-1;
        for(int i=n; i>=1; i--){
            while(tail+1!=head && height[que[tail]]>=height[i]) tail--;
            if(tail+1!=head) rb[i]=que[tail]-1;
            else rb[i]=n;
            que[++tail]=i;
        }

        memset(sum, 0, sizeof(sum)); //前缀和维护区间内属于str1的后缀个数
        for(int i=1; i<=n; i++){
            if(sa[i]<len)
             sum[i]++;
             sum[i]+=sum[i-1];
        }
        long long ans=0;//注意答案可能大于int
        for(int i=2; i<=n; i++){
            if(height[i]<K) continue;
            int l=lb[i]-1, r=rb[i];
            int ltot=i-l, rtot=r-i+1;
            ans+=(long long)query(l, i-1)*(rtot-query(i, r))*(height[i]-K+1);
            ans+=(long long)(ltot-query(l,i-1))*query(i, r)*(height[i]-K+1);
        }
        printf("%lld\n", ans);
    }
    return 0;
}







手把手教你学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真 本文详细介绍了四开关Buck-Boost(FSBB)变换器的Simulink仿真方法,重点解决模式切换时的直通风险和输出电压波动问题。通过统一电压PI控制、迟滞比较模式仲裁(Buck/Boost/Pass-Through)和200ns死区设计,实现了Vin从26V到22V变化时Vout稳定在12V±0.15V。关键步骤包括:搭建功率级电路、Stateflow模式判断、PI控制器输出占空比映射(Buck模式D≈Vo/Vin,Boost模式D≈1-Vo/Vin),以及带死区的PWM信号分配。仿真验证了切换过程中 阅读详情

相关推荐

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改

本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。

weixin_42550597的博客 419

POJ3415 Common Substrings 【后缀数组 + 单调栈】

常见的子串 时间限制:5000MS 内存限制:65536K 提交总数:11942 接受:4051 描述 字符串T的子字符串被定义为: Ť(我,ķ)=Ť我Ť我1...ŤI + K-1,1≤我≤I + K-1≤|T|。 给定两个字符串A,B和一个整数K,我们定义S,一组三元组(i,j,k): S= {(i,j,k)...

weixin_30851409的博客 144

Innovus Function ECO实战:5步搞定数字后端设计中的网表修正(含Calibre LVS验证技巧)

本文提供了一份完整的Innovus Function ECO实战指南,详细解析了数字后端设计中网表修正的五步流程。从理解Function ECO概念、准备关键文件,到在Innovus中执行逻辑比对、自动布线及GUI检查,并重点攻克了ECO后Calibre LVS验证的难点与调试技巧,帮助工程师高效、精准地完成流片前的设计微调。

day7的博客 946

POJ - 3415 Common Substrings(后缀数组 + 单调栈)

题意: 求两个子串的大于等于k 的重复子串有多少个。 { 求两个子串的重复子串我们可以用单调栈来做, 然而,在同一个子串中,我们想要找重复子串的个数,那就是 height数组之和。 } 思路: 两个子串,我们用后缀数组维护,把两个子串合并在一起,然后中间加一个特殊字符。 {  看网上别人的博客。 一个n长度的子串,我们把后边填一个0,就是在位置n上加0, 这个字符串我们从 0 编...

Top_xiao的博客 467

逆向解析抖音核心校验参数:bd-ticket-guard-client-data的Python生成逻辑

本文深入解析了抖音核心校验参数bd-ticket-guard-client-data的生成逻辑,详细介绍了其动态证书生成、非对称加密机制及Python实现方法。通过逆向分析,揭示了抖音安全体系的双层验证机制,包括RSA密钥对生成、证书签名及时间戳校验等关键技术要点,为开发者提供了一套完整的参数生成解决方案。

weixin_26642481的博客 405

手把手教你用VCS+Verdi在Linux下仿真蜂鸟E203 RISC-V核(附波形调试技巧)

本文详细介绍了在Linux环境下使用VCS和Verdi工具链对蜂鸟E203 RISC-V核进行仿真验证的完整流程。从环境配置、工程结构解析到VCS编译优化和Verdi波形分析技巧,提供了实战性强的调试方法和性能优化策略,帮助工程师高效完成数字IC验证工作。

weixin_42531163的博客 415

poj 3415 后缀数组+单调栈

题目大意: 求两个字符串的长度大于k的公共子串的个数(可以相同) 基本思路: 后缀数组+单调栈,就是降低复杂度到O(n); 代码如下: #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; ...

weixin_30832405的博客 202

AD2428与SigmaStudio:从节点自动配置与EEPROM存储实战

本文详细介绍了AD2428 A2B收发器与SigmaStudio开发环境的集成应用,重点讲解从节点自动配置与EEPROM存储的实战流程。通过硬件连接、属性配置、数据导出及嵌入式系统集成等步骤,实现设备上电自启动,提升汽车音频系统的可靠性与部署效率。

g8f9d0s1a2的博客 650

【POJ3415】 Common Substrings(后缀数组|SAM)

Common Substrings Description A substring of a stringTis defined as: T(i,k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. Given two stringsA,Band one integerK, we defineS, a set of triples (i,...

weixin_30278237的博客 184

基于STM32设计的心率脉搏测量仪(项目资料ID:9)

本设计基于STM32F103单片机开发了一款便携式心率脉搏测量仪,通过光电传感器采集脉搏信号,经放大(约1200倍)、滤波(低通及四阶低通滤波)、比较及偏置电压调理后,由STM32进行ADC采样与数据处理。硬件采用Altium Designer设计,包含信号调理电路(限定心率范围43.4-800次/分钟)及电源管理模块;软件基于STM32CubeMX开发,利用队列存储和时间间隔平均算法优化精度,实现多终端显示(OLED实时心率/动画、MATLAB波形分析、蓝牙传输至手机)。系统支持自动启停(检测脉搏启

以培养嵌入式工程师为己任 1万+

海思芯片YOLOv8模型部署完整指南:从RPN硬化到8bit量化精度优化

本文详细介绍了在海思芯片平台部署YOLOv8目标检测模型的完整方案,重点解决8bit量化精度损失问题。通过分析海思RPN硬化层的性能优势(1.9ms推理时间),对比不同量化策略(16bit仅损失0.6AP,8bit损失5.2AP),并深入定位到strides计算层是量化误差的主要来源。关键突破在于采用混合精度策略(敏感层16bit,其余8bit),使8bit量化AP回升4.1%,同时保持3.4ms的推理速度和60%的低NPU占用率。文章还提供了量化参数调整、校准数据集优化等进阶技巧,为边缘计算应用提供了性能

FJN110的博客 731

POJ 3415 Common Substrings(后缀数组+单调队列)

题目链接:http://poj.org/problem?id=3415 后缀数组论文链接:https://wenku.baidu.com/view/5b886b1ea76e58fafab00374.html 解题思路: 求不小于k的最长公共子串的数量。 ① 首先连接两个字符串A,B,构造后缀和height数组,我们按照k,将height>=k的分在一起,属于这一堆内的后缀,只有可能...

shadiao.的博客 140

Android 13 wificond讲解

Android 13 wificond讲解

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 2932

poj3415 Common Substrings (后缀数组+单调队列)

Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9414   Accepted: 3123 Description A substring of a string T is defined as: T(i, k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|.

新月 718

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

poj 3415

单调队列+后缀数组 #include #include #include using namespace std; const int maxn=2e5+19; int r[maxn]; int *rank,height[maxn],sa[maxn]; int wx[maxn],wy[maxn],cnt[maxn]; char a[maxn],b[maxn]; struct { l

yrleep的专栏 819

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ_3415 Common Substrings 后缀数组

题目链接:http://poj.org/problem?id=3415 题意:给你两个字符串str0、str1和K,求一共有多少个这样的三元组S{i,j,k}= {(i , j , k) | str0{i...i+k-1} == str1{j..j+k-1} }。 思路:题意就是在str0中找一个i,在str1中找一个j,要求他们的最长公共前缀l >= K,这样这组i,j对答案的贡献值就是l

Chris_Home 758

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

POJ - 3415 Common Substrings (后缀数组)

A substring of a stringTis defined as: T(i,k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. Given two stringsA,Band one integerK, we defineS, a set of triples (i,j,k): S= {(i,j,k...

weixin_30611509的博客 93

[POJ3415]Common Substrings && 后缀数组+单调栈

被这个东西狂虐一上午T_T 果然像我这样的人最好早点滚粗  果然像我这样的人最好早点滚粗  果然像我这样的人最好早点滚粗  (因为很重要所以要说三遍) 首先我们要想办法求一个串的k长度重复字串 然后我们就会想到用后缀数组来求 那么这个公共字串问题就可以转化为分别求 s1, s2, s1+s2的k重复字串数 构造完后缀数组和height数组(偷懒的我简称h数组)后 可以发现 假设

shiyukun1998的专栏 579

【笔记】后缀数组

参考资料 hihocoder 例题 后缀数组 1. Suffix 把一个字符串后面加上一个符号 # ,将其所有后缀取出来,其中suffix[i]表示从第i个字符开始的后缀。 2. SA(后缀数组) 把suffix按字典序排好序,sa[i]表示排名第 i 小的后缀索引是几。 3. Rank suffix排序之后的名次,rank[i]表示suffix[i]是排名第几小的。 4. Height heig...

秋叶红于二月花 439

【POJ 3415】Common Substrings

【链接】h在这里写链接 【题意】 求两个串的长度大于等于k的公共子串个数。 相同的重复计数。 【题解】 先把两个字符串用一个分隔符分开。最好比出现的字符都大的一个数字。 然后,对于这一个字符串,求出它的Height和Sa数组。 然后,把height 数组【连续】大于等于k的,分成一组去考虑。 (没有大于等于k了的话,显...

AWCXV 78

poj3415

不得不说height数组确实是个很神的东西,这道题就是维护一个单调队列然后使里面的值递增,我们考虑为什么可以这么做。因为height数组的传递性(姑且这么叫吧) 例如height 有一段为3 4 5 下一个如果为2那么对之前出现的后缀的影响每个都是2,并且对于之后的后缀,除了2之外其他的数据都是没有用的,所以只需保留2,所以最后就会维护出一个递增序列 #include   #include

qq_22036225的博客 462

POJ 3415 Common Substrings ( 后缀数组+单调栈(那篇论文中的题目。多谢罗神给的的思路)

Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9781 Accepted: 3222 DescriptionA substring of a string T is defined as:T(i, k)=TiTi+1…Ti+k-1, 1≤i≤i+k-1≤|T|. Gi

My_stage的博客 652

POJ 数据结构(3)

数据结构 trie图的建立和应用,DFA hdd2222,poj1204, poj2778, poj3691 LCA和RMQ问题 poj1330 双端队列和它的应用 poj2823(单调队列) 左偏树 poj3666,poj3016 后缀树,后缀数组 ...

weixin_33895695的博客 147

经典数据结构

红黑树 B树 B+树 R树  2-3-4树 K-d 树  树状数组 跳跃表 线段树 伸展树 单调队列 单调栈  一致哈希表 并查集 逆序对 环形缓存 双端队列 字典树  后缀树 后缀 数组 Trie树 AC自动机  折半枚举 分桶法和平方分割 堆 二项堆  斐波那契堆 Treap树堆  快速排序

rosepicker的专栏 410
上一篇: poj 1325 最小顶点覆盖
下一篇: hdu 4630 线段树+离线处理
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值