一直在研究01,邻居都没做。。。
虽然凉了,但是不知道做的对不对就难受,有没有人看看这两个程序对不对
邻居:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ int N; cin>>N; vector<vector<int>> a(N,vector<int>(2)); for(int i=0;i<N;i++){ cin>>a[i][0]>>a[i][1]; } int ans=0; vector<vector<int>> b; for(int i=0;i<N;i++){ if(!b.size()){ b.push_back(a[i]); }else{ for(int j=0;j<b.size();j++){ if(a[i][0]-b[j][0]==a[i][1]-b[j][1]){ //匹配已有模式 ans++; break; } } b.push_back(a[i]); //压入新模式 } } /* sort(a.begin(),a.end()); for(int i=0;i<N-1;i++){ for(int j=i+1;j<N;j++){ if(a[i][0]-a[j][0]==a[i][1]-a[j][1]){ ans++; } } } */ cout<<ans<<endl; return 0; }
01:
a:b=c:d 则a:b=(a+c):(b+d) 如果串a可划分为某子串b,那么所有划分位置b 2b 3b都符合01比例
#include<iostream> #include<vector> #include<string> using namespace std; int main(){ int n; string str; cin>>n; cin>>str; vector<int>ans(n,1); string s=""; vector<int>n0(n,0); vector<int>n1(n,0); if(str[0]=='0'){ n0[0]=1; }else{ n1[0]=1; } int ma,mi; for(int i=1;i<n;i++){ if(str[i]=='0'){ n0[i]=n0[i-1]+1; n1[i]=n1[i-1]; } if(str[i]=='1'){ n1[i]=n1[i-1]+1; n0[i]=n0[i-1]; } if(n0[i]>1&&n1[i]>1){ ma=n0[i]>=n1[i]?n0[i]:n1[i]; mi=n0[i]>=n1[i]?n1[i]:n0[i]; int k=0; for(int i=mi;i>1;i--){ if(ma%i==0&&mi%i==0){ k=i; //当前位置0 1数量的最大公约数,作为划分的次数 } } if(k==0) continue; int l=(i+1)/k; int flag=1; for(int p=1;p<l&&i-p*l>=0;p++){ cout<<i<<" "<<i-p*l<<endl; if(n0[i]*n1[i-p*l]!=n1[i]*n0[i-p*l]){ //匹配每次划分处的01之比 flag=0; break; } } if(flag){ ans[i]=k; } } else if(n0[i]==0){ ans[i]=n1[i]; }else if(n1[i]==0){ ans[i]=n0[i]; } } for(int i=0;i<n-1;i++){ cout<<ans[i]<<" "; } cout<<ans[n-1]<<endl; return 0; }
全部评论
(1) 回帖