【学习笔记】基础字符串算法
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;
}

浙公网安备 33010602011771号