就是直接肛就对了
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,len,sum=0,sum1=0,sum2=0;///分别记录字母的数量,?的数量,*的数量 6 char a[201]; 7 gets(a); 8 cin>>n; 9 len=strlen(a); 10 for(int i=0; i<len; i++) 11 if(a[i]>=‘a‘&&a[i]<=‘z‘) 12 sum++; 13 else if(a[i]==‘?‘) 14 sum1++; 15 else if(a[i]==‘*‘) 16 sum2++; 17 if(sum==n)///如果字母的数量等于n直接输出字符串(跳过*,?) 18 { 19 for(int i=0; i<len; i++) 20 if(a[i]>=‘a‘&&a[i]<=‘z‘) 21 cout<<a[i]; 22 } 23 else if(sum>n)///如果预期的少于已经有的,则需要减少字符 24 { 25 int ch=sum-n;///判断要减少的个数 26 if(ch>(sum1+sum2))///如果?和*的数量加起来都少于要减少的则就不可能存在,输出impossible 27 cout<<"Impossible"; 28 else///反之,消掉ch个字符 29 { 30 for(int i=0; i<len; i++) 31 { 32 if((a[i+1]==‘?‘||a[i+1]==‘*‘)&&ch)///消去前ch个非字母字符前的字母 33 { 34 i++;///还要跳过?* 35 --ch; 36 } 37 else if((a[i]==‘?‘||a[i]==‘*‘)&&ch==0) 38 continue; 39 else cout<<a[i]; 40 } 41 } 42 } 43 else if(sum<n)///如果n>已经有的字母,就需要增加字母 44 { 45 if(sum2==0)///*是唯一能增加字母的,如果雪花为0个就不能让字母增加所以输出impossible 46 cout<<"Impossible"; 47 else///对于第一个*,输出需要增加的个数的第一个*前的字母 48 { 49 int flag=0; 50 for(int i=0; i<len; i++) 51 { 52 if(a[i]==‘?‘||a[i]==‘*‘) 53 continue; 54 else if(a[i+1]==‘*‘&&flag==0) 55 { 56 cout<<a[i]; 57 for(int j=1; j<=n-sum; j++) 58 cout<<a[i]; 59 i++; 60 flag=1; 61 } 62 else cout<<a[i]; 63 } 64 } 65 } 66 67 return 0; 68 }
原文:https://www.cnblogs.com/tp25959/p/10235799.html