字符串匹配入门

单模匹配–KMP

定义两个字符串text和pattern,pattern不断位移的过程中,需要让其中间断掉的时候剪枝

Eg:ABAABAB

建next数组–>最长相等前后缀[0…k] [i-k…i]

i:0->pattern.length()-1,j=-1

  • case1:p[j+1]=p[i]–>j++;
  • case2:上一个元素内拆前后缀
    while(j!=-1&&p[i]!=p[j+1])j=next[j];
    p[j+1]=p[i]–>j++;

状态转移:next[i]=j;

移位匹配

i:0->text.length()-1,j=-1

  • case1:p[j+1]=t[i]–>j++;
  • case2:上一个元素内拆前后缀
    while(j!=-1&&t[i]!=p[j+1])j=next[j];
    p[j+1]=t[i]–>j++;

判断:j==m-1–>return true

代码模板

scanf("%s%s",s1,s2);int a=strlen(s1);//text
int b=strlen(s2);//pattern
nxt[0]=-1;
for(i=1;i<b;++i){
    while(j!=-1&&s2[j+1]!=s2[i])j=nxt[j];
    if(s2[j+1]==s2[i])++j;
    nxt[i]=j;
}j=-1;
for(i=0;i<a;++i){
    while(j!=-1&&s2[j+1]!=s1[i])j=nxt[j];
    if(s2[j+1]==s1[i])++j;
    if(j==b-1)printf("%d\n",i-b+2);
}

多模匹配–AC自动机

定义text和pattern,pattern1在某位fail时可以从该位fail想办法剪枝

建fail数组

根据fail来源建表顺序可以是BFS,指向为了进行下一个模板,fail为了记录跳转的起点

每取一个u,i:26capital

  • case1:e[u][i]!=0回到0或者上一个fail下面p
fail[e[u][i]]=e[fail[u]][i];
  • case2:e[u][i]=0指向上一个fail下面p
e[u][i]=e[fail[u]][i];

插入trie

i:pattern,j=0

  • case1:e[j][i]=0->e[j][i]=++cnt(总序号);
  • case2:e[j][i]!=0

判断:val[pattern.length()-1]=1;

状态转移:j=e[j][i]

query

是否允许串重复出现–>是否设置val[]=-1

i:text

去重处理t=j,while(t)fail[t]=-1,t=fail[t];

  • case1:val[j]!=-1->sum+=val[j];
  • case2:val[j]=-1

状态转移:j=e[j][i]

代码

struct AC{
    int fail[500010],val[500010],e[500010][26],cnt=0;
    void ins(char* p){
        int len=strlen(p);int j=0;
        for(int i=0;i<len;++i){
            int x=p[i]-'a';
            if(e[j][x]==0)e[j][x]=++cnt;
            j=e[j][x];
        }
        val[j]++;
    }
    void build(){
        for(int i=0;i<26;++i)if(e[0][i])fail[e[0][i]]=0,q.push(e[0][i]);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=0;i<26;++i)
	            if(e[u][i])fail[e[u][i]]=e[fail[u]][i],q.push(e[u][i]);
	            else e[u][i]=e[fail[u]][i];
        }
    }
    int query(char* p){
        int len=strlen(p),j=0,sum=0;
        for(int i=0;i<len;++i){
            int x=p[i]-'a';j=e[j][x];int t=j;
            while(t&&val[t]!=-1)sum+=val[t],val[t]=-1,t=fail[t];
        }
        return sum;
    }
}at;
基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值