首页 > 其他分享 >字符串模板汇总

字符串模板汇总

时间:2022-09-24 16:33:34浏览次数:56  
标签:const int scanf 汇总 char MAXN 字符串 include 模板

字符串模板

KMP

#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

const int MAXN=1000010;

int n,m,next[MAXN];
char a[MAXN],b[MAXN];	//a为主串,b为模式串 

int main(){
	scanf("%s%s",a+1,b+1);
	n=strlen(a+1),m=strlen(b+1);
	int j=0;
	next[1]=0;
	for(int i=1;i<m;++i){
		while(j&&b[j+1]!=b[i+1]) j=next[j];
		if(b[j+1]==b[i+1]) ++j;
		next[i+1]=j;
	}
	j=0;
	for(int i=0;i<n;++i){
		while(j&&b[j+1]!=a[i+1]) j=next[j];
		if(b[j+1]==a[i+1]) ++j;
		if(j==m){
			printf("%d\n",i-j+2);	//字符串a的第(i+1)-j+1个字母开头的字符与b匹配 
			j=next[j];
		}
	}
	for(int i=1;i<=m;++i)
		printf("%d ",next[i]);
	puts("");
	return 0;
}

manacher

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

const int MAXN=22000010;

int n,p[MAXN];
char s[MAXN],a[MAXN];

int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	a[0]='$';
	for(int i=1;i<=n;++i)
		a[i*2-1]='$',a[i*2]=s[i];
	a[n*2+1]='$';
	n=n*2+1;
	int k=0,mx=0;
	for(int i=1;i<=n;++i){
		if(i<=mx) p[i]=min(mx-i,p[k*2-i]);
		while(a[i+p[i]+1]==a[i-p[i]-1]) ++p[i];
		if(i+p[i]>mx) mx=i+p[i],k=i;
	}
	int Ans=0;
	for(int i=1;i<=n;++i)
		Ans=max(Ans,p[i]);
	printf("%d\n",Ans);
	return 0;
}

哈希字符串匹配

#include<iostream>
#include<cstring>
#include<cstdio>

#define LL long long

using namespace std;

const int MAXN=1000010;
const int MOD=1e9+7; 
const int Base=27;

int n,m,nxt[MAXN];
char s1[MAXN];	//主串 
char s2[MAXN];	//模式串

LL Hash[MAXN],p[MAXN],hashs2;

LL get_Hash1(int l,int r){
	return (Hash[r]-Hash[l-1]*p[r-l+1]%MOD+MOD)%MOD;
}

int main(){
	scanf("%s",s1);
	scanf("%s",s2);
	n=strlen(s1);
	m=strlen(s2);
	p[0]=1;
	for(int i=0;i<n;++i){
		Hash[i]=(Hash[i-1]*Base+s1[i]-'A'+1)%MOD;
		p[i+1]=p[i]*Base%MOD;
	}
	for(int i=0;i<m;++i)
		hashs2=(hashs2*Base+s2[i]-'A'+1)%MOD;

	for(int i=0;i+m-1<n;++i){
		if(get_Hash1(i,i+m-1)==hashs2){
			printf("%d\n",i+1);
		}
	}
	return 0;
}

双哈希字符串查重

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map> 
using namespace std;

#define LL long long

const int MAXN = 10010;
const int MAXM = 1510;
const int Base = 79;
const int MOD1 = 1e9+9;
const int MOD2 = 1e9+7;

int get_num(char x){
	if('A'<=x&&x<='Z') return x-'A';
	else if('a'<=x&&x<='z') return x-'a'+26;
	else return x-'0'+52; 
}

int n,cnt;
map<int,bool> Hash;
char s[MAXM];

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%s",s);
		int len=strlen(s);
		LL ha1=0ll,ha2=0ll;
		for(int i=0;i<len;++i){
			ha1=(ha1*Base+get_num(s[i]))%MOD1;
			ha2=(ha2*Base+get_num(s[i]))%MOD2;
		}
		if(!Hash[ha1]&&!Hash[ha2]){
			++cnt;
			Hash[ha1]=Hash[ha2]=1;
		}
	}
	printf("%d\n",cnt);
	return 0;
}

trie

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

const int MAXN=3000010;

int T,n,q,num,ch[MAXN][65],cnt[MAXN];

inline int get_num(char x){
	if('A'<=x&&x<='Z') return x-'A';
	else if('a'<=x&&x<='z') return x-'a'+26;
	else return x-'0'+52; 
}

void insert(char s[]){
	int l=strlen(s);
	int p=0;
	for(int i=0;i<l;++i){
		int c=get_num(s[i]);
		if(!ch[p][c]) ch[p][c]=++num;
		p=ch[p][c];
		++cnt[p];
	}
}

int query(char s[]){
	int l=strlen(s);
	int p=0;
	for(int i=0;i<l;++i){
		int c=get_num(s[i]);
		if(!ch[p][c]) return 0;
		p=ch[p][c];
	}
	return cnt[p];
}

int main(){
	scanf("%d",&T);
	while(T--){
		for(int i=0;i<=num;++i){
			for(int j=0;j<63;++j)
				ch[i][j]=0;
			cnt[i]=0;
		}
		num=0;
		scanf("%d%d",&n,&q);
		char s[MAXN];
		for(int i=1;i<=n;++i){
			scanf("%s",s);
			insert(s);
		}
		for(int i=1;i<=q;++i){
			scanf("%s",s);
			printf("%d\n",query(s));
		}
	}
	return 0;
}

AC自动机

#include<iostream>
#include<cstring>
#include<cstdio>

#define rep(i,l,r) for(int i=l;i<=r;i++)
#define reset(a) memset(a,0,sizeof(a))
#define MAXN 20010

using namespace std;

int ch[MAXN][26],next[MAXN],mark[MAXN];
int sum[MAXN],que[MAXN<<5],pos[MAXN];
int n,cnt=1,head,tail,maxx;
char s[155][155];

void insert(char ss[],int p){
	int u=1,len=strlen(ss);
	rep(i,0,len-1){
		int c=ss[i]-'a';
		if(!ch[u][c]) ch[u][c]=++cnt;
		u=ch[u][c];
	}
	mark[u]++; pos[p]=u;
}

void bfs(){
	head=tail=0;
	rep(i,0,25) ch[0][i]=1;
	que[++tail]=1; next[1]=0;
	while(head<tail){
		int u=que[++head];
		rep(i,0,25){
			if(!ch[u][i])
				ch[u][i]=ch[next[u]][i];
			else{
				que[++tail]=ch[u][i];
				next[ch[u][i]]=ch[next[u]][i];
			}
		}
	}
}

void find(char ss[]){
	int u=1,len=strlen(ss),c,k;
	rep(i,0,len-1){
		c=ss[i]-'a';
		k=ch[u][c];
		while(k>1){
			if(mark[k]){
				sum[k]++;
				if(sum[k]>maxx)
					maxx=sum[k];
			}k=next[k];
		}
		u=ch[u][c];
	}
}

int main(){
	scanf("%d",&n);
	char S[1000100];
	while(n){
		reset(ch); reset(next);
		reset(sum); reset(mark);
		reset(pos); cnt=1; maxx=0;
		for(int i=1;i<=n;i++){
	 		scanf("%s",s[i]);
	 		insert(s[i],i);
		}
		scanf("%s",S);
		bfs();
		find(S);
		printf("%d\n",maxx);
		for(int i=1;i<=n;i++)
		 if(sum[pos[i]]==maxx)
		  printf("%s\n",s[i]);
		scanf("%d",&n);
	}
	return 0;
}

标签:const,int,scanf,汇总,char,MAXN,字符串,include,模板
From: https://www.cnblogs.com/66-CCF-F/p/16725911.html

相关文章

  • 【code基础】字符串的截取
    截取字符串的前k位,比如abc,截取前两位,留下最后一位如果要截取前k位,则实现方法为s.substring(k)publicvoidsubStrings(){Strings="abc";System.out.......
  • variadic templates (数量不定的模板参数)
    voidprint(){}//当只剩下一个参数时,args为空,执行这个版本的printtemplate<typenameT,typename...Types>voidprint(constT&firstArg,constTypes&...args){......
  • C语言第17天,字符串与字符指针
    1.字符串常量不可修改#include<stdio.h>intmain(){char*pStr="HelloWorld\n";printf("%s",pStr);pStr[0]='h';//将H变为hprintf("%s",pStr);return0;}我们知道字......
  • 模板方法模式总结
    模板方法模式近期在探究Android源码时,发现Android里面用到了大量的钩子方法,下意识反应这是一种设计模式的应用——模板方法,于是重新翻阅了刘伟老师的《Java设计模式》......
  • 模板分文件编写,CUDA打印
    ifndefFUN_HPPdefineFUN_HPPifdefined(USE_EXPORT)defineEXPORTexportelsedefineEXPORTendifEXPORTtemplatevoidprint_typeof(Tconst&);if!defined(US......
  • JavaScript 字符串(String) 对象
    字符串可以使用单引号或者双引号使用位置索引可以访问字符串中的任何字符,字符第一个字符为【0】,依次等可在字符串中使用引号varanswer="Heiscalled'Johnny'";也可......
  • Java面试题汇总
    1、Java基础1.1、ConcurrentHashMap的底层实现,jdk1.7和jdk1.8的区别;1.2、GC的原理,涉及到的算法有哪些,GC调优怎么处理;1.3、ArrayList和LinkedList的区别是什么,底层实现是......
  • 《Effective STL》笔记汇总
    EffectiveSTL笔记-第1章容器EffectiveSTL笔记-第2章vector和stringEffectiveSTL笔记-第3章关联容器EffectiveSTL笔记-第4章迭代器EffectiveSTL笔记-......
  • k8s:截止2022.09.23(当前最新)的k8s软件版本支持docker容器引擎的情况:汇总信息
      ...toonewtoosupport!Kubernetes1.24.6+-->Docker版本removethedependencyonDocker!!!Withthedockershimremoval,coreKubernetesnolongerhasto......
  • 【C#】萌狼学习C#那年写的笔记汇总
    目录习题汇总例子汇总报错解决考前复习习题汇总【C#】【平时作业】习题-2-数据类型运算符表达式-萌狼蓝天-博客园(cnblogs.com)【C#】【平时作业】习题-3-数组-......