SGU 505 Prefixes and suffixes

本文介绍了一种通过字符串排序和字典树、线段树结合的算法来解决字符串前缀匹配问题的方法。该算法首先将字符串排序,并利用字典树记录每个字符在前缀中的排名,然后反转字符串并再次排序,从而确定相同前缀的后缀位置。通过线段树维护区间最大值和最小值,实现快速查询,最终获得前缀匹配的字符串段。实例演示了算法的有效性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解   现将字符串排序; 那么某前缀在字符串中出现肯定是连续的;写几个案例就知道了;这是记录每个字符在以前缀排名的rank ; 然后将字符串反序; 再排序;依照前缀,可以知道相同名字的后缀也会出现在一段排序好的连续的字符串里面;这样得到前缀的区间为 [a,b],  [c,d]; 只要统计每个字符是否在 a 到 b 之间; 同时满足在 c 到 d 之间;            获取某个前缀的第一个匹配段字符串 和 最后一个字符串也就是 [a,b] 使用了字典树搞; 然后 再用线段树保留最大值和最小值;竟然没有超时, 啊,,哈哈;

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<vector>
using namespace std;

struct date{
    int sta,end;
    date *next[27];
}*root,*rot,tree[412345]; int total;
date *creat_node(){
    for( int i = 0; i < 27; i++ )
    tree[total].next[i] = NULL;
    tree[total].sta = -1;
    tree[total].end = -1;
    return &tree[total++];
}
void inint( ){
    total = 0;
    root = creat_node();
    rot  = creat_node();
}
void insert( string &word,int i,int tab )
{
    date *p; int len = word.length();
    if( tab )p = root;
    else     p = rot;
    for( int j = 0; j < len; j++ )
    {
        int num = word[j] - 'a';
        if( p->next[num] == NULL )
        {
            p->next[num] = creat_node();
            p->next[num]->sta = i;
        }
        p->next[num]->end = i;
        p = p->next[num];
    }
}
int sta,en;
void work( string &word,int tab )
{
    date *p; int len = word.length();
    if( tab ) p = root;
    else p = rot;
    for( int j = 0; j < len; j++ )
    {
        int num = word[j] - 'a';
        if( p->next[num] == NULL ){
            sta = -1; en = -1; return;
        }
        p = p->next[num]; sta = p->sta; en = p->end;
    }
}
struct DAte{
   string sss; int pos;
   bool operator <(const DAte &a )const{
       return sss < a.sss;
   }
}arr[1123456];
struct Date{
   int lt,rt,Max,Min,num;
}node[1123456];
void build( int lt,int rt,int t ){
    node[t].lt = lt; node[t].rt = rt;
    if( lt == rt ){ node[t].num = 1; node[t].Max = node[t].Min = arr[lt].pos; return; }
    int mid = ( lt+rt )>>1;
    build( lt,mid,t<<1 ); build( mid+1,rt,t<<1|1 );
    node[t].Max = max( node[t<<1].Max,node[t<<1|1].Max );
    node[t].Min = min( node[t<<1].Min,node[t<<1|1].Min );
    node[t].num = node[t<<1].num+node[t<<1|1].num;
}
int query( int lt,int rt,int a,int b,int t )
{
    if( node[t].Min > b || node[t].Max < a  )return 0;
    int mid = ( node[t].lt+node[t].rt )>>1;
    if( node[t].lt == lt && node[t].rt == rt )
    {
        if( node[t].Max <= b && node[t].Min >= a )return node[t].num;
        return query( lt,mid,a,b,t<<1 ) + query( mid+1,rt,a,b,t<<1|1 );
    }
    if( node[t<<1].rt >= rt )return query( lt,rt,a,b,t<<1 );
    else if( node[t<<1|1].lt <= lt )return query( lt,rt,a,b,t<<1|1 );
    else return query(lt,mid,a,b,t<<1)+query(mid+1,rt,a,b,t<<1|1);
}
int main( )
{
    int N,M; string str;
    while( scanf("%d",&N) != EOF )
    { 
        for( int i = 0; i < N; i++ )cin>>arr[i].sss;
           sort(arr,arr+N); inint();
        for( int i = 0; i < N; i++ ) arr[i].pos = i;
        for( int i = 0; i < N; i++ ) insert(arr[i].sss,i,1 );
        for( int i = 0; i < N; i++ ) reverse(arr[i].sss.begin(),arr[i].sss.end());
           sort(arr,arr+N);  build(0,N-1,1);
        for( int i = 0; i < N; i++ ) insert(arr[i].sss,i,0);
        scanf("%d",&M);
        for( int i = 1; i <= M; i++ ){
            cin>>str; work(str,1); int a = sta,c = en;
            cin>>str; reverse(str.begin(),str.end());work(str,0); int b = sta,d = en;
            if( a == -1 || b == -1 )cout<<0<<endl;
            else cout<<query( b,d,a,c,1 )<<endl;
        }
    }
    return 0;
}
/*
14
abasbssbs
sfasffsd
adfsas
fdsssf
safas
fsadf
fases
sdesas
aesdf
sefss
aseesaes
fdsasesa
seasea
sedfsas
11
a a
ab ac
fa a
fa s
ac ca
fd sa
fd as
se sa
fs fd
fd fs
ab sb
*/

 

转载于:https://www.cnblogs.com/wulangzhou/p/3438886.html

内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
内容概要:本文详细介绍了基于Seggiani提出的渣层计算模型,针对Prenflo气流床气化炉中炉渣的积累和流动进行了模拟。模型不仅集成了三维代码以提供气化炉内部的温度和浓度分布,还探讨了操作条件变化对炉渣行为的影响。文章通过Python代码实现了模型的核心功能,包括炉渣粘度模型、流动速率计算、厚度更新、与三维模型的集成以及可视化展示。此外,还扩展了模型以考虑炉渣组成对特性的影响,并引入了Bingham流体模型,更精确地描述了含未溶解颗粒的熔渣流动。最后,通过实例展示了氧气-蒸汽流量增加2%时的动态响应,分析了温度、流动特性和渣层分布的变化。 适合人群:从事煤气化技术研究的专业人士、化工过程模拟工程师、以及对工业气化炉操作优化感兴趣的科研人员。 使用场景及目标:①评估不同操作条件下气化炉内炉渣的行为变化;②预测并优化气化炉的操作参数(如温度、氧煤比等),以防止炉渣堵塞;③为工业气化炉的设计和操作提供理论支持和技术指导。 其他说明:该模型的实现基于理论公式和经验数据,为确保模型准确性,实际应用中需要根据具体气化炉的数据进行参数校准。模型还考虑了多个物理场的耦合,包括质量、动量和能量守恒方程,能够模拟不同操作条件下的渣层演变。此外,提供了稳态求解器和动态模拟工具,可用于扰动测试和工业应用案例分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值