CodeForces - 1367

    技术2022-07-11  156

    CodeForces - 1367

    A - Short Substrings

    很显然 前两个字母都取 之后隔一个取一个 char s[maxn],ans[maxn]; int t; int main() { scanf("%d",&t); while(t--) { int m=0; scanf("%s",s); ans[m++]=s[0];ans[m++]=s[1]; for (int i=3;i<strlen(s);i+=2)ans[m++]=s[i]; repp(i,0,m)printf("%c",ans[i]);puts(""); } return 0; }


    B - Even Array

    判断两种不同类型的非法情况是否相等 int t,n,x; int main() { scanf("%d",&t); while(t--) { int ji=0,ou=0; scanf("%d",&n); rep(i,0,n-1) { scanf("%d",&x); if (i%2==x%2)continue; if (x%2==1)ji++; if (x%2==0)ou++; } if (ji==ou)W(ji); else W(-1); } return 0; }


    C - Social Distance

    暴力预处理后再计算答案 int t,n,k; char s[maxn]; bool ok[maxn]; int solve(int x) { if (x%(k+1)==0)return x/(k+1); else return x/(k+1)+1; } int main() { scanf("%d",&t); while(t--) { mem(ok,true); scanf("%d%d",&n,&k); scanf("%s",s); int sz=strlen(s); repp(i,0,sz){if (s[i]=='1'){rep(j,max(i-k,0),min(i+k,sz-1))ok[j]=false;}} int num=0,ans=0; repp(i,0,sz) { if (ok[i])num++; else { ans+=solve(num); num=0; } } ans+=solve(num); W(ans); } return 0; }


    D - Task On The Board

    b[i]=0的位置肯定填当前剩余字母中最大的 如果这个最大字母不够数量,就置为0,向下直到找到一个符合的字母。 每次找到合适字母填上之后,要对其余的b[i]减去距离 比Second大的有且只有First,所以每次去掉距离后,填Second的位置的b[]必被减为0 重复操作 int t,m,b[maxn],num[maxn],sz; char s[maxn],ans[maxn]; bool vis[maxn]; vector<int> V; bool check() { rep(i,1,m)if (ans[i]=='#')return false; return true; } int main() { scanf("%d",&t); while(t--) { mem(num,0);mem(vis,false); scanf("%s",s); sz=strlen(s); repp(i,0,sz)num[s[i]-'a']++; scanf("%d",&m); rep(i,1,m)ans[i]='#',scanf("%d",&b[i]); while(!check()) { V.clear(); rep(i,1,m) { if (vis[i]||b[i])continue; V.pb(i); vis[i]=true; } for (int i=25;i>=0;i--) { if (num[i]>=V.size()) { num[i]=0; repp(j,0,V.size())ans[V[j]]='a'+i; break; } num[i]=0; } repp(i,0,V.size())rep(j,1,m)if (!vis[j])b[j]-=abs(V[i]-j); } rep(i,1,m)printf("%c",ans[i]);puts(""); } return 0; }


    E - Necklace Assembly

    假设取的长度为i gcd(i,k)即为循环元的长度 i/(gcd(i,k))即为循环元的个数 假设字母'a'参与循环元的组成,则a的个数x与循环元中a的个数y的关系是:y=x/(i/(gcd(i,k))) 对每个字母都进行遍历,如果最终能组成循环元的最大长度大于gcd(i,k),则符合条件 int t,n,k,num[30]; char s[maxn]; int main() { scanf("%d",&t); while(t--) { int ans=0; mem(num,0); scanf("%d%d",&n,&k); scanf("%s",s); repp(i,0,strlen(s))num[s[i]-'a']++; rep(i,1,n) { int T=__gcd(i,k); int Blocksize=i/T; int cnt=0; rep(j,0,25)cnt+=num[j]/Blocksize; if (cnt>=T)ans=max(ans,i); } W(ans); } return 0; }
    Processed: 0.026, SQL: 9