这道题目我直接在程序上注释了:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int t123123123123123123,a,b; 6 cin>>t123123123123123123;//防重名 7 while(t123123123123123123--) 8 { 9 string s; 10 scanf("%d%d\n",&a,&b);//要吃换行因为↓(getline) 吃换行会影响结果 11 getline(cin,s);//防止有空格 12 int len=s.length();//不用多次计算s.length() 13 int t=0;//状态在前边为1表示给的就不是个回文串不必再计算 14 for(int i=0;i<len;i++) 15 { 16 if(s[i]!='?')//如果有值可以考虑给对面的赋值 17 { 18 if(s[len-1-i]!='?'&&s[len-1-i]!=s[i])//如果对面也有值但不相等说明给的就不是个回文串不必再计算 19 { 20 t=1; 21 break; 22 } 23 else if(s[len-1-i]=='?') s[len-1-i]=s[i];//如果对面需要赋值就给他赋值成s[i] 24 } 25 } 26 if(t) 27 {//如果给的就不是个回文串不必再计算 28 printf("NO\n"); 29 continue; 30 } 31 for(int i=0;i<s.length();i++)//统计各用了多少 32 { 33 if(s[i]=='0') a--; 34 else if(s[i]=='1') b--; 35 } 36 if(a<0||b<0)//用多了不必再计算 37 { 38 printf("NO\n"); 39 continue; 40 }//a b 表示括号里可以填几个1 0 41 t=0; 42 for(int i=0;i<len;i++) 43 { 44 if(s[i]=='?')//需要填 45 { 46 if(i==len-1-i)//是中间值 47 { 48 if(a&1)//哪个是奇数用谁 49 { 50 s[i]='0'; 51 a--; 52 } 53 else if(b&1) 54 { 55 s[i]='1'; 56 b--; 57 } 58 else//还没填完就不够了不必再计算 59 { 60 t=1; 61 break; 62 } 63 } 64 else 65 { 66 if(a>=2)//可以同时填两个一个自己,一个对面 67 { 68 a-=2; 69 s[i]=s[len-1-i]='0'; 70 } 71 else if(b>=2) 72 { 73 b-=2; 74 s[i]=s[len-1-i]='1'; 75 } 76 else//还没填完就不够了不必再计算 77 { 78 t=1; 79 break; 80 } 81 } 82 } 83 } 84 if(t==1)//还没填完就不够了 85 { 86 printf("NO\n"); 87 continue; 88 } 89 printf("YES\n"); 90 } 91 return 0; 92 }
标签:t123123123123123123,int,没填,len,length,回文 From: https://www.cnblogs.com/wjk53233/p/16905484.html