• [CSP-S模拟测试]:reverse(模拟)


    题目传送门(内部题56)


    输入格式

    第一行包含一个整数:$T$,表示数据组数。
    接下来$T$行,每行包含两个字符串:$a b$。


    输出格式

    对于每组数据,如果存在$c$,输出最长的情况下字典序最大的$c$,否则输出$-1$。


    样例

    样例输入:

    3
    AB BA
    ABA BAB
    AB ABAA

    样例输出:

    -1
    AB
    AB


    数据范围与提示

    样例解释:

    对于第一组数据,不存在这样的$c$。
    对于第二组数据,$AB$以通过第一种操作到$ABA$,$AB$可以通过第二种操作到$BAB$。
    对于第三组数据,$AB$不需要操作即可得到$AB$,$AB$进行两次第二种操作即可得到$ABAA$,并且$AB$是长度最长的字典序最小的满足条件的$c$。

    数据范围:

    $ullet$对于$10\%$的数据,$1leqslant |a|<|b|leqslant 6$;
    $ullet$对于$30\%$的数据,$1leqslant |a|<|b|leqslant 12$;
    $ullet$对于$100\%$的数据,$1leqslant |a|<|b|leqslant 2,000,1leqslant Tleqslant 20$,保证$a,b$都是由$A,B$字符组成。


    题解

    这道题的难点就在于怎么让其字典序问题。

    其实,我们根本不用考虑字典序的问题,这可以从两点看出。

      $alpha.$题目和样例解释中都说的是字典序最小,然而输出格式中却写的是字典序最大,教练又没有改题,所以这道题不用考虑字典序问题。

      $eta.$模拟一下过程,一个字符串只能由一种方式转移过来,所以我们也可以找回去,而对于一个长度我们也只能找回去一个串,所以不用考虑字典序问题。

    解决了这个问题,就是一道大模拟了,其实可以用$hash$做到线性时间复杂度,但是显然出题人写标程也想偷个懒。

    时间复杂度:$Theta(n^2)$。

    期望得分:$100$分。

    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    char ch1[2001],ch2[2001];
    int a[2001],b[2001];
    bool judge(){for(int i=1;i<=a[0];i++)if(a[i]!=b[i])return 0;return 1;}
    int main()
    {
    	int T;scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%s%s",ch1+1,ch2+1);
    		a[0]=strlen(ch1+1);
    		b[0]=strlen(ch2+1);
    		for(int i=1;i<=a[0];i++)a[i]=ch1[i]-'A';
    		for(int i=1;i<=b[0];i++)b[i]=ch2[i]-'A';
    		if(a[0]>b[0])swap(a,b);
    		while(b[0]>a[0])
    		{
    			if(b[b[0]])
    			{
    				b[0]--;
    				reverse(b+1,b+b[0]+1);
    			}
    			else b[0]--;
    		}
    		while(1)
    		{
    			if(judge())
    			{
    				for(int i=1;i<=b[0];i++)
    					if(b[i])printf("B");
    					else printf("A");
    				puts("");
    				break;
    			}
    			if(a[a[0]])
    			{
    				a[0]--;
    				reverse(a+1,a+a[0]+1);
    			}
    			else a[0]--;
    			if(b[b[0]])
    			{
    				b[0]--;
    				reverse(b+1,b+b[0]+1);
    			}
    			else b[0]--;
    			if(!a[0]&&!b[0]){puts("-1");break;}
    		}	
    	}
    	return 0;
    } 

    rp++

  • 相关阅读:
    搜狗输入法——从繁体改成简体
    java官网下载
    eclipse官网下载
    java拷贝指定文件夹下的指定文件类型
    bat脚本——删除当前文件夹的所有指定文件类型
    windows系统下载地址大全&大白菜下载和教程
    struts2——文件下载自定义文件名,包括中文
    struts2——文件下载(简单的功能)
    nginx官网下载&百度云分享
    Apache HTTP Server——官网下载
  • 原文地址:https://www.cnblogs.com/wzc521/p/11586328.html
Copyright © 2020-2023  润新知