이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6 + 5 ;
int dp[MAX][2][2][2] ;
int arr[MAX] , arr2[MAX] ;
int n ;
int solve(int idx , int t , int t0 , int t1)
{
if(idx == n)
return 0 ;
int &ret = dp[idx][t][t0][t1] ;
if(ret != -1)
return ret ;
if (t0 == 1 && t1 == 1)
while (1) ;
ret = 1e9 ;
if(t)
{
if(arr[idx] != arr2[idx])
{
if(t0 && arr2[idx] == 1)
ret = solve(idx+1 , t , 0 , t1) ;
else if(t1 && arr2[idx] == 0)
ret = solve(idx+1 , t , t0 , 0) ;
else
{
ret = solve(idx+1 , t , t0 , t1) ;
}
return ret ;
}
else
{
int choice1 = 1e9 , choice2 = 1e9 ;
/*if(arr2[idx] == 0)
{
choice1 = solve(idx+1 , 0 , 1 , 0) + 1;
choice2 = solve(idx+1 , 1 , 1 , 0) + 1;
ret = min(choice1 , choice2) ;
return ret ;
}
else
{
choice1 = solve(idx+1 , 0 , 0 , 1) + 1 ;
choice2 = solve(idx+1 , 1 , 0 , 1) + 1 ;
ret = min(choice1 , choice2) ;
return ret ;
}*/
if(arr[idx] == 0)
{
if(t0 == 1)
choice1 = solve(idx+1 , t , t0 , t1) ;
else
{
choice1 = solve(idx+1 , 0 , 0 , 0) ;
choice2 = solve(idx+1 , 1 , 1 , 0) + 1;
}
ret = min(choice1 , choice2) ;
return ret ;
}
else
{
if(t1 == 1)
choice1 = solve(idx+1 , t , t0 , t1) ;
else
{
choice1 = solve(idx+1 , 0 , 0, 0) ;
choice2 = solve(idx+1 , 1 , 0 , 1) + 1 ;
}
ret = min(choice1 , choice2) ;
return ret ;
}
}
}
if(t1)
{
if(arr2[idx] == 1)
ret = solve(idx+1 , t , t0 , t1) ;
else
{
if(arr[idx] == arr2[idx])
ret = solve(idx+1 , 0 , 0 , 0) ;
else
{
int choice1 = solve(idx+1 , 1 , 0 , 0) + 1 ;
int choice2 = solve(idx+1 , 0 , 1 , 0) + 1 ;
//int choice3 = solve(idx+1 , 1 , 1 , 0) + 2 ;
ret = min(choice1 , choice2) ;
}
return ret ;
}
return ret ;
}
if(t0)
{
if(arr2[idx] == 0)
ret = solve(idx+1 , t , t0 , t1) ;
else
{
if(arr[idx] == arr2[idx])
ret = solve(idx+1 , 0 , 0 , 0) ;
else
{
int choice1 = solve(idx+1 , 1 , 0 , 0) + 1 ;
int choice2 = solve(idx+1 , 0 , 0 , 1) + 1 ;
//int choice3 = solve(idx+1 , 1 , 1 , 0) + 2 ;
ret = min(choice1 , choice2) ;
}
return ret ;
}
return ret ;
}
if(arr[idx] == arr2[idx])
ret = solve(idx+1 , t , t0 , t1) ;
else
{
int choice1 = solve(idx+1 , 1 , 0 , 0) + 1 ;
int choice2 = 1e9 ;
if(arr2[idx] == 0)
choice2 = solve(idx+1 , 0 , 1 , 0) + 1 ;
else
choice2 = solve(idx+1 , 0 , 0 , 1) + 1 ;
ret = min(choice1 , choice2) ;
}
return ret ;
}
int main()
{
cin>>n ;
string s1 , s2 ;
cin>>s1>>s2 ;
for(int i = 0 ; i < n ; ++i)
arr[i] = (s1[i] - '0') ;
for(int i = 0 ; i < n ; ++i)
arr2[i] = (s2[i] - '0') ;
memset(dp , -1 , sizeof(dp)) ;
return cout<<solve(0 , 0 , 0 , 0)<<"\n" , 0 ;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |