• 2020.12.02 晚间训练


    Day -2

    总得分:100/300

    一、string

    【题目描述】

    给定两个字符串(s)(t),其中s只包含小写字母以及(*)(t)只包含小写字母。

    你可以进行任意多次操作,每次选择(s) 中的一个(*),将它修改为任意多个(可以是(0)个)它的前一个字符。问是否能将(s) 修改为(t)

    多组数据。

    【输入数据】

    第一行一个整数(T) 表示数据组数。

    每组数据两行,第一行一个字符串s,第二行一个字符串t。

    【输出数据】

    每组数据输出一行,如果能将s修改为t,输出Yes,否则输出No。

    【样例输入】

    2
    a*
    aaaa
    a*
    ab

    【样例输出】

    Yes
    No

    【数据范围】

    对于(20%) 的数据,(|s|),(|t|<=7)

    对于(60%) 的数据,(|s|),(|t|<=300)

    对于(100%) 的数据,(T<=100)(|s|),(|t|<=30000)

    Solution

    没什么好说的,模拟。

    把两个字符串连续相同的字母给合并为一个的形式,即建立结构体的桶用于存放。

    对于出现了(*)的情况,在它前面的一个字母上打标,表示前面一个字母可以复制无限个。

    注意:

    很有可能出现以下情况:

    a**ab
    aab

    因为两个(a) 之间被(*) 断开,导致错开了(2) 个桶

    所以遇到这种情况要合并掉

    code:

    #include <bits/stdc++.h>
    #define REP(i, x, y) for(register int i = x; i < y; i++)
    #define rep(i, x, y) for(register int i = x; i <= y; i++)
    #define PER(i, x, y) for(register int i = x; i > y; i--)
    #define per(i, x, y) for(register int i = x; i >= y; i--)
    using namespace std;
    const int N = 30005;
    struct node{
    	char ch;
    	int sum;
    }t1[N], t2[N];
    string s1, s2;
    int T, len1, len2, tag[N];
    int main()
    {
    	freopen("string.in", "r", stdin);
    	freopen("string.out", "w", stdout);
    	scanf("%d", &T);
    	while(T--)
    	{
    		int cnt1 = 0, cnt2 = 0;
    		int temp = 1;
    		memset(t1, 0, sizeof t1);
    		memset(t2, 0, sizeof t2);
    		memset(tag, 0, sizeof tag);
    		cin >> s1 >> s2;
    		len1 = s1.length();
    		len2 = s2.length();
    		rep(i, 1, len1)
    		{
    			t1[i].sum = 0;
    		}
    		rep(i, 1, len2)
    		{
    			t2[i].sum = 0;
    		}
    		rep(i, 0, len1 - 1)
    		{
    			if(s1[i] != '*')
    			{
    				if(t1[cnt1].ch != s1[i])
    				{
    					cnt1++;
    				}
    				t1[cnt1].ch = s1[i];	
    				temp = t1[cnt1].sum + 1;
    				while(s1[i + 1] == s1[i])
    				{
    					temp++;
    					i++;
    				}
    				t1[cnt1].sum = temp;
    				temp = 1;
    			}	
    			else
    			{
    				tag[cnt1] = 1;
    			}
    		}
    		temp = 1;
    		rep(i, 0, len2 - 1)
    		{
    			if(s2[i] != '*')
    			{
    				t2[++cnt2].ch = s2[i];	
    			
    				while(s2[i + 1] == s2[i])
    				{
    					temp++;
    					i++;
    				}
    				t2[cnt2].sum = temp;
    				temp = 1;
    			}	
    		}
    		if(cnt1 != cnt2)
    		{
    			cout << "No" << endl;
    			continue;
    		}
    		int f = 0;
    		rep(i, 1, cnt1)
    		{
    			if(t1[i].ch != t2[i].ch)
    			{
    				cout << "No" << endl;
    				f = 1;
    				break;
    			}
    			else if((t1[i].sum > t2[i].sum) || (t1[i].sum < t2[i].sum && tag[i] == 0))
    			{
    				cout << "No" << endl;
    				f = 1;
    				break;				
    			}
    		}
    		if(!f)
    		{
    			cout <<"Yes" << endl;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    利用本地浏览器远程服务器上的jupyter notebook
    解决IIS服务器Web访问提示输入密码
    IIS 配置
    override new 关键字的区别
    ASP.NET的网站的设计与优化
    山东人!
    远程连接SQL Server 2000服务器的解决方案
    对软件的新认识
    一个程序员成长的六个阶段
    优秀程序员应当具备的品质
  • 原文地址:https://www.cnblogs.com/pjxpjx/p/14076178.html
Copyright © 2020-2023  润新知