社区讨论

B 怎么挂了

P15650[省选联考 2026] 摩卡串 / string参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mmg8yd7r
此快照首次捕获于
2026/03/07 19:35
3 天前
此快照最后确认于
2026/03/07 21:45
3 天前
查看原帖
qoj 上 25 分,属于是挂了 5 分,但如果代码真有问题能挂 5 分那么也能挂 15 分。
不知道是赛后复原出问题还是就是思路伪了,不要挂分啊。
CPP
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<numeric>
#include<vector>
#include<set>
#include<queue>
using namespace std;
int c,T,n,k;
string s,t,ans;
void bfs() {
  queue<string> q;
  q.push("0");
  q.push("1");
  while(q.size()) {
    string t=q.front();
    for(int i=0;i+s.length()-1<t.length();i++)
      if(t.substr(i,s.length())==s) {
        int cnt=0;
        for(int l=0;l<t.length();l++)
          for(int r=l;r<t.length();r++) {
            if(t.substr(l,r-l+1)<s)
              cnt++;
		  }
		if(cnt==k) {
		  ans=t;
		  return;
		}
        break;
	  }
	if(t.length()<15) {
	  q.push(t+'0');
	  q.push(t+'1');
	}
	q.pop();
  }
  ans="Impossible";
}
int main() {
//  freopen("string.in","r",stdin);
//  freopen("string.out","w+",stdout);
  ios::sync_with_stdio(0);
  cout.tie(0);
  cin>>c>>T;
  while(T--) {
    cin>>n>>k>>s;
    if(c<=3)
      bfs();
    else {
      if(n==1 or n*(n+1)>>1>k+1)
        ans="Impossible";
      else {
        k-=((n*(n+1)>>1)-1);
        for(int i=0;i*(n-1)<=k;i++) {
          int remain=k;
          t=s;
          for(int j=1;j<=i;j++)
            t+='0';
          remain-=(i*(n-1));
          for(int j=n-1;j>=1 && remain>0;--j)
            while(remain>=j*(j+1)>>1) {
              t+='1';
              for(int g=1;g<=j;g++)
                t+='0';
              remain-=(j*(j+1)>>1);
			}
		  if(i) {
		    if(t.length()<ans.length())
		      ans=t;
		  }
		  else
		    ans=t;
		}
	  }
	}
	cout<<ans<<'\n';
  }
}

回复

3 条回复,欢迎继续交流。

正在加载回复...