回文串

 

 

 

 这道题目我直接在程序上注释了:

 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 }

 

posted @ 2022-11-19 09:42  王浩泽  阅读(28)  评论(0)    收藏  举报