[codeforces 1379A] Acacius and String 2种匹配形式+难想的反例

Codeforces Round #657 (Div. 2)   参与排名人数8684   错过了难得17:00比赛,可惜

[codeforces 1379A]   Acacius and String   2种匹配形式+难想的反例

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1379/problem/A

Problem Lang Verdict Time Memory
A - Acacius and String GNU C++17 Accepted 31 ms 3900 KB

题目大意:给定一个包含问号的字符串,其中的问号能设置成任意小写字符,问该字符串能否只匹配字符串abacaba一次,若能输出将问号替换后的新字符串,若不能,输出NO.

极难的第一题,一度放弃,一度坚持,最终,还是把它给AC了,没看任何人代码,该题,难在想反例,若如下样例能通过,代码也就基本能AC.

Input:
3
13
abacab?bacaba
11
abacab??aba
12
abacab????caba
Output:
NO
YES
abacabazaba
YES
abacabazzzca

基本思路:有2种匹配形式。

1.纯字母的匹配,这种形式比较简单。

2.有问号参与的匹配,这种形式比较难想。

在编写这种情况过程中,一度绝望,难想的测试数据(本文开始部分已经给出),还是想出了,同一字串可匹配的数量较多,但看到了数据范围,n (7≤n≤50), length of a string s.又回过神来了。

样例模拟如下:

7
abacaba

YES
abacaba

abacaba
abacaba
纯字母匹配形式有1种,如上

7
???????

YES
abacaba

???????
abacaba
有问号参与的匹配形式有1种,如上

11
aba?abacaba

Yes
abazabacaba

aba?abacaba
    abacaba
纯字母匹配形式有1种,如上
aba?abacaba
abacaba
有问号参与的匹配形式有1种,如上

11
abacaba?aba

YES
abacabazaba


abacaba?aba
abacaba
纯字母匹配形式有1种,如上
abacaba?aba
    abacaba
有问号参与的匹配形式有1种,如上


15
asdf???f???qwer

NO

纯字母匹配形式有0种
有问号参与的匹配形式有0种

11
abacabacaba

NO

abacabacaba
abacaba

abacabacaba
    abacaba
纯字母匹配形式有2种,如上

对难点数据解释如下:

13
abacab?bacaba

NO

纯字母匹配形式有0种
abacab?bacaba
abacaba

abacab?bacaba
      abacaba
有问号参与的匹配形式有2种,如上
尝试第一种,将?改成a,发现匹配有2种,如下
abacababacaba
abacaba
      abacaba
尝试第二种,将?改成a,发现匹配有2种,如下
abacababacaba
      abacaba
abacaba


11
abacab??aba

YES
abacabazaba

纯字母匹配形式有0种
abacab??aba
abacaba

abacab??aba
    abacaba
有问号参与的匹配形式有2种,如上
尝试第一种匹配,将第一种匹配中的?改成匹配字母,第一种匹配之外的字母'?'改成字母'z',发现匹配有1种,如下
abacabazaba
abacaba
尝试第二种匹配,将第二种匹配中的?改成匹配字母,第二种匹配之外的字母'?'改成字母'z',发现匹配有2种,如下
abacabacaba
    abacaba
abacaba


12
abacab????caba

YES
abacabazzzca

纯字母匹配形式有0种
abacab????caba
abacaba

abacab????caba
       abacaba
有问号参与的匹配形式有2种
尝试第一种匹配,将第一种匹配中的?改成匹配字母,第一种匹配之外的字母'?'改成字母'z',发现匹配有1种,如下
abacabazzzcaba
abacaba
尝试第二种匹配,将第二种匹配中的?改成匹配字母,第二种匹配之外的字母'?'改成字母'z',发现匹配有1种,如下
abacabzabacaba
       abacaba

AC代码如下:

#include 
#include 
char a[100],b[20]="abacaba",c[100];
int main(){
	int t,n,m,i,acnt,qcnt,j,q,qk[55],k,flag;
	scanf("%d",&t);
	while(t--){
		acnt=qcnt=0,m=7;
		scanf("%d%s",&n,a);
		for(i=0;i1)printf("NO\n");//纯字母的匹配
		else if(acnt==1){//纯字母的匹配
			for(i=0;i=1){//acnt==0,有问号参与的匹配
			flag=0;
			for(i=0;i

 

你可能感兴趣的:(codeforces)