substr时间复杂度O(N),不能一遍遍找,会超时
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int N=5e5+10;
map<string,int>mp;
vector<string>v[N];
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;
string s1,s2;cin>>s1>>s2;
mp.clear();
string ss;
for(int i=0;i<=n;i++)
{
ss+="1";
}
for(int i=0;i<n;i++)
{
string x=s1[0]+s1.substr(1,i)+s2.substr(i);
mp[x]++;
//out<<s1.substr(0,i)<<" "<<s2.substr(i)<<endl;
if(x<ss) ss=x;
}
cout<<ss<<endl<<mp[ss]<<endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int N=5e5+10;
map<string,int>mp;
vector<string>v[N];
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;
string s1,s2;cin>>s1>>s2;
string x=s1+s2[n-1];
int num=n-1;
int flag=0;
//substr时间复杂度O(n) 不可一一查询会超时
for(int i=0;i<n;i++)
{
//找到这个点时就是最佳的拐点
if(s1[i]=='1'&&s2[i-1]=='0')
{
x=s1.substr(0,i)+s2.substr(i-1);
num=i-1;
break;
}
}
int cnt=1;
for(int j=num;;j--)
{
//倒着走不相等 就不可以了 如果相等说明向下向右都可以即++ 一定是连续的交叉相等
//一旦出现不相等 就结束 即方案数
if(s1[j]!=s2[j-1]) break;
cnt++;
}
cout<<x<<endl<<cnt<<endl;
}
return 0;
}
DP
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int N=5e5+10;
map<string,int>mp;
vector<string>v[N];
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;
int arr[2][n];
int dp[2][n];
for(int i=0;i<=1;i++)
{
string s;cin>>s;
for(int j=0;j<n;j++)
{
arr[i][j]=s[j]-'0';//首先预处理
dp[i][j]=0;//dp值预处理
}
}
dp[0][0]=1;//初始点唯一,一个方案
string ans;
ans+=(char)(arr[0][0]+'0');//然后初始点也要在路径字符串上算上
for(int i=0;i<=n-1;i++)//总共移动步数
{
int tmp=1;
//第一部分 看后面能不能转移到0
for(int j=0;j<=1;j++)//向下几次
{
//枚举当前可能的点 走不了 不可能转移次数大于移动次数
if(j>i) continue;
int x=j,y=i-j;//找出枚举的点
if(dp[x][y]==0) continue;//如果这个点不能被走到 就continue
if(x==0)//否则能向下
{
if(arr[x+1][y]==0)//看向下能不能走到0
{
tmp=0;
}
}
if(y<=n-2)//能向右
{
if(arr[x][y+1]==0)
{
tmp=0;//看向右能不能走到0
}
}
}
//把目前添加的字符添加进去
if(tmp==0) ans+='0';
else ans+='1';
//第二部分,我们再把应该转移的去转移一下
for(int j=0;j<=1;j++)
{
if(j>i) continue;
int x=j ,y=i-j;
if(dp[x][y]==0)continue;
if(x==0)
{
if(arr[x+1][y]==tmp)
{
dp[x+1][y]+=dp[x][y];
}
}
if(y<=n-2)
{
if(arr[x][y+1]==tmp)
{
dp[x][y+1]+=dp[x][y];
}
}
}
}
cout<<ans<<endl;
cout<<dp[1][n-1]<<endl;
}
return 0;
}