【学习笔记】基础字符串算法

1.【异或 Manacher】

P3501 [POI 2010] ANT-Antisymmetry

判相等,改成判对称

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char to[400];
int p[N];
int main(){
	int n;cin>>n;
	
	string s="@#";
	for(int i=1;i<=n;i++){
		char k;cin>>k;
		s+=k;
		s+='#';
	}s+='!';
	to['1']='0';to['0']='1';to['#']='#';
	to['@']='@';to['!']='!';
	
	int M=1,R=1;
	int ans=0;
	for(int i=2;i<s.size();i++){
		if(s[i]!='#') continue;
		if(i<=R) p[i]=min(R-i,p[2*M-i]);
		else p[i]=0;
		while(s[i+p[i]+1]==to[s[i-p[i]-1]]) p[i]++;
		if(i+p[i]>R){
			M=i;
			R=i+p[i];
		}
		ans+=p[i]/2;
	}
	cout<<ans<<"\n";
	return 0;
}

posted @ 2026-08-25 08:29  Aistyr  阅读(6)  评论(1)    收藏  举报