1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include<bits/stdc++.h> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std;
typedef pair<int,int> pr;
const int maxn=5005;
int n,ps0,ps1,pt0,pt1,ps2,pt2; pr ps[4*maxn],pt[4*maxn]; char s[maxn],t[maxn];
void pre(char *t,pr *p,int &p0,int &p1,int &p2) { fo(i,0,n+5) p[++p0]=make_pair(0,i&1); if (p[p0].second!=(t[0]>t[1])) p[++p0]=make_pair(0,(t[0]>t[1])); p1=p0+1; fo(i,1,n-1) if (t[i]!=t[i+1]) p[++p0]=make_pair(i,(t[i]>t[i+1])); p2=p0; int cur=(t[n]=='1'); fo(i,0,n+5) p[++p0]=make_pair(n,cur), cur^=1; }
int main() { scanf("%d",&n); scanf("%s",s+1); scanf("%s",t+1); if (n<=2) { int ans=0; fo(i,1,n) ans+=(s[i]!=t[i]); printf("%d\n",ans); return 0; } s[0]=(s[1]=='1' ?'0' :'1' ); t[0]=(t[1]=='1' ?'0' :'1' ); pre(s,ps,ps0,ps1,ps2); pre(t,pt,pt0,pt1,pt2); int ans=n*n*10; fo(i,1,pt2) if (ps[ps1].second==pt[i].second) { int bs=ps1-max(0,i-pt1), be=ps2+max(0,pt2-(i+ps2-ps1)), bt=i-(ps1-bs), len=be-bs+1; int ans1=0; fo(j,1,len) ans1+=abs(ps[bs+j-1].first-pt[bt+j-1].first); ans=min(ans,ans1); } printf("%d\n",ans); }
|