首页 > 其他分享 >字符串

字符串

时间:2024-02-22 20:55:47浏览次数:17  
标签:... Fu while mr 字符串 回文

字符串

KMP

\(p_i\)表示\(s_{1...i}\)的最长真前缀,真后缀(“真”即是不包括原串)相等

处理就很简单,每个i就判断能否更新i-1的答案,如不行就i变成\(p_{i-1}\)再处理

Fu(i,2,m+n+1){
	int j=p[i-1];
	while(j>0&&a[i]!=a[j+1]) j=p[j];
	if(a[i]==a[j+1]) p[i]=j+1;
}

EXKMP

\(p_i\)表示\(s_{0...n}\)和\(s_{i...n}\)的LCP长度

对于i,考虑一个\(s_{l,r}\)为s的最大的前缀(l<i)

i<=r时,则\(s_{i..r}=s_{i-l,r-l}\),即\(p_i\geq min(p_{i-l},r-i+1)\)

然后就可以暴力扩展,更新l,r

时间复杂度可以保证,因为每次暴力扩展,r都会更新

Fu(i,1,n+m){
	if(i<=r) p[i]=min(p[i-l],r-i+1);
	while(b[p[i]]==b[i+p[i]]) p[i]++;
	if(i+p[i]-1>r) l=i,r=i+p[i]-1;
}

Manacher

大概思路就是现在已经确定了一个最右边的回文串,中心为mm,最右边为mr

我们枚举的以i为中心的回文串,若在最右边的回文串内,那么发现它一定有个对称的左边,然后处理一下

否则就重头开始匹配

时间复杂度:发现每次匹配mr都会变大,所以是\(O(n)\)的

Fu(i,2,n*2){
	int k=i>mr?1:min(d[mm*2-i],mr-i+1);
	while(s[i+k]==s[i-k]&&i+k<=n*2+1) k++;
	d[i]=k;
	if(mr<i+k-1) mr=i+k-1,mm=i;
	ans=max(ans,k-1);
}

AC自动机

先把trie树建出来,然后类似建kmp

void getfail(){
	q[1]=0;
	while(l<r){
		l++;
		Fu(i,0,25){
			int u=trie[q[l]].son[i];
			if(u){
				q[++r]=u;
				trie[u].fail=l==1?0:trie[trie[q[l]].fail].son[i];
			}
			else trie[q[l]].son[i]=trie[trie[q[l]].fail].son[i];
		}
	}
}
void find(){
	int o=0;
	Fu(i,1,n){
		o=trie[o].son[s[i]-'a'];
		int u=o;
		while(u&&trie[u].bj!=-1){
			ans+=trie[u].bj;
			trie[u].bj=-1;
			u=trie[u].fail;
		}
	}
}

标签:...,Fu,while,mr,字符串,回文
From: https://www.cnblogs.com/zhy114514/p/18024040

相关文章

  • linux统计字符串出现次数(linux查询关键字出现的个数了解)
     使用脚本统计字符串出现次数#!/bin/bash#获取要监控的本地服务器IP地址IP=`ifconfig|grepinet|grep-vE'inet6|127.0.0.1'|awk'{print$2}'`echo"IP地址:"$IP#获取cpu总核数cpu_num=`grep-c"modelname"/proc/cpuinfo`echo"cpu总核数:&q......
  • 如何在python中判断一个字符串是否可以转换为数字
    方法一:isdigit()不可识别汉字小数类型str1='1'str2='2.1'str3='三'str4='3.3.3.3'print(str1.isdigit())print(str2.isdigit())print(str3.isdigit())print(str4.isdigit())结果:TrueFalseFalseFalse方法二:isdecim......
  • C++ 第二节课 结构体, 字符串 和 C语言的区分
    1#include<iostream>23usingnamespacestd;456//结构体7structStu{8stringname;9intage;1011//结构体重的函数叫做成员函数在C中是不能直接写函数的只能使用函数指针,通过指针的回调出发函数(行为)12//默认的修饰符......
  • 格式化字符串
    泄露栈的内存,泄露任意地址内存修改栈的内存,修改任意地址内存\x00截断漏洞用栈溢出覆盖字符串截断符\x00使得泄露一些重要信息,如canary泄露或直接泄露flag#include<stdio.h>#include<string.h>intmain(){char*x="hello,world";strcat(x,"flag{666}");intl......
  • PHP 字符串拼接性能大比拼
    三种方式:直接用.来进行连接。用.=进行连接。先压入数组,再通过join函数连接。<?phpfunctionget_tm(){list($usec,$sec)=explode("",microtime());return((float)$usec+(float)$sec);}$temp="test";$num=100000;#define("num"......
  • 常用字符串算法
    KMP我们考虑朴素的字符串匹配过程。voidmatch(conststring&s,conststring&p){//findpinsfor(inti=0;i<s.size();++i)for(intj=0;j<p.size()&&i+j<s.size();++j){if(s[i+j]!=p[j])break;if(......
  • 【C++】判断回文字符串。回文指的是顺读和逆读都一样的字符串。例如,“tot”和“otto”
    //判断字符串是否是回文字符串(考虑大小写,空格和标点符号)boolpalindrome1(string&str){stringret;for(auto&c:str){if(isalpha(c)){if(isupper(c)){ret.push_back(tolower(c));}else{ret.push_back(c);}......
  • delphi按键值对重组字符串
    问题背景:有一组基金代码串,原逻辑按基金代码单个调整为按父子基金代码组作为条件获取查询结果解决原理:采用TStringList类哈希表操作方式重组字符串List:=TStringList.Create;List.Add('aaa=111');List.Add('bbb=222');List.Add('ccc=333');List.Add('ddd=444');ShowMessag......
  • 十六进制字符串,转化为十六进制数据并write 写出去
    如果你想使用write函数以十六进制方式发送数据,你需要将十六进制数据转换为字节,并将字节作为参数传递给write函数。下面是一个示例程序,演示如何将十六进制字符串转换为字节,并使用write函数发送数据:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<st......
  • redis自学(1) 动态字符串SDS
      字符串是redis最常见的数据结构,但redis并没有直接使用C语言的字符串,是因为C语言本身其实是没有字符串的,所谓的字符串其实是字符数组(Java语言中的字符串是一个对象),所以C语言的字符串有很多问题:①获取字符串长度需要通过运算C语言的字符串数组都是以’\0’结尾,这是一个字符......