BestCoder Round #48

Pro ID=1001  

wyh2000 and a string problem

问题描述
青年理论计算机科学家wyh2000在教小学生一些基础的字符串概念。
定义一个字符串
   
    s
   的子序列为将
   
    s
   中一些元素删掉得到的字符串。可以删掉全部元素,可以不删,也可以只删一些。
他还教了小学生如何判断一个串是不是另一个串的子序列。比如给你一个串,要求判断
   
    wyh
   是不是它的子序列,那么你只需要找一个
   
    w
   ,找一个
   
    y
   ,再找一个
   
    h
   ,使得
   
    w
   
   
    y
   前面,
   
    y
   
   
    h
   前面即可。
有一天小学生拿着一个串问他“
   
    wyh
   是不是这个串的子序列?”
但是wyh2000有重度近视眼,如果字符串中有一段连续的
   
    v
   (至少两个),那么他会把它看成一个
   
    w
   。例如,字符串
   
    vvv
   会被看成
   
    w
   ,字符串
   
    vvwvvv
   会被看成
   
    www
   ,字符串
   
    vwvv
   会被看成
   
    vww
   。
请问wyh2000会怎么回答这个问题?
输入描述
第一行为数据组数
   
    T(1T105)
   。
接下来
   
    T
   行,每行一个字符串,表示小学生拿来问wyh2000的串。
总串长不超过3145728。只包含小写字母。
hack数据字符串长度不超过100000。
输出描述
对于每组数据,如果wyh2000会把
   
    wyh
   看成该串的子串,那么输出一行
   
    Yes
   ,否则输出一行
   
    No
   
输入样例
4
woshiyangli
woyeshiyangli
vvuuyeh
vuvuyeh
输出样例
No
Yes
Yes
No
水题,直接上AC代码。

#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=3145730;
char s[MAXN];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>s;
        int len=strlen(s);
        s[len]='a';//在串后面随便加一个目标字串不包含的字符,为了在循环中当i循环到len-1时,s[i+1]能有有一个<span style="font-family: Arial, Helvetica, sans-serif;">目标字串不包含的字符</span>
        s[len+1]='\0';
        char temp[3]={'w','y','h'};
        int top=0;
        for(int i=0;i<len;i++)
        {
            if(top==0)
            {
                if(s[i]=='v'&&s[i+1]=='v')
                {
                    top++;
                }
                else if(s[i]==temp[top])
                {
                    top++;
                }
            }
            else
            {
                if(s[i]==temp[top])
                {
                    top++;
                }
            }
        }
        if(top==3)
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
        }
    }
    return 0;
}


Pro ID=1002

wyh2000 and pupil

问题描述
青年理论计算机科学家wyh2000在教导他的小学生。
共有
   
    n
   个小学生,编号为
   
    1n
   。为了增加小学生之间的凝聚力,wyh2000决定将所有小学生分成
   
    2
   组,每组都至少有
   
    1
   个人。
但是有些小学生之间并不认识,而且如果
   
    a
   不认识
   
    b
   ,那么
   
    b
   也不认识
   
    a
   。
Wyh2000希望每组中的小学生都互相认识。而且第一组的人要尽可能多。
请你帮wyh2000求出第一组和第二组的人数是多少。如果找不到分组方案,则输出"Poor wyh"。
输入描述
第一行一个数
   
    T
   ,表示数据组数。
对于每组数据,第一行两个数
   
    n,m
   ,表示小学生数量和互相不认识的小学生的数量。
接下来
   
    m
   行,每行两个数
   
    x,y(x<y)
   ,表示
   
    x
   不认识
   
    y
   
   
    y
   不认识
   
    x
   。保证一对
   
    (x,y)
   只会出现一次。

   
    T10,0n,m100000
   
输出描述
对于每组数据,输出答案。
输入样例
2
8 5
3 4
5 6
1 2
5 8
3 5
5 4
2 3
4 5
3 4
2 4
输出样例
5 3
Poor wyh

无向图的DFS,由于当时没考虑内存的原因,一直在该,搞到最后搞好了发现比赛已经结束1分钟了。哭~~~T-T,也不知道能不能AC

我的做法:把每个人看出一个顶点, 一个标记顶点的V数组,一个无向图,一个第一组的人的数组a,一个第二组人的数组b。

若某个人没分到组,则加入第一组, 然后和此人不认识的全部加入第二组,每做完一次分组都判断b组的人是否存在不认识的[即b中任何2人是否不认识彼此]

若存在则说明图存在环,则无法分组,否则最终就能把所有人分到a,b 2组中, 再判断哪组人多就先输出哪组[因为a组人数要尽量多]。


代码[未验证能否AC]

#include<iostream>
#include<string>
using namespace std;
string map[100001];
int n,m;
bool ans;
int main()
{
	int t,p1,p2;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		string a;
		string b;
		string v;
		ans=true;
		for(int i=0;i<n;i++)
		{
			v+='0';
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				map[i]+='0';
			}
		}
		for(int i=1;i<=m;i++)
		{
			cin>>p1>>p2;
			map[p1-1][p2-1]='1';
			map[p2-1][p1-1]='1';
		}
		for(int i=1;i<=n;i++)
		{
			if(!ans)
			{
				break;
			}
			if(v[i-1]=='0')
			{
				a+=(i+48);
				v[i-1]='1';
			}
			else
			{
				continue;
			}
			for(int j=1;j<=n;j++)
			{
				if(map[i-1][j-1]=='1'&&(v[j-1]=='0'))
				{
					v[j-1]='1';
					b+=(j+48);
				}
			}
			for(int k=0;k<b.size();k++)
			{
				for(int l=k+1;l<b.size();l++)
				{
					if(map[b[k]-'1'][b[l]-'1']=='1')
					{
						ans=false;
						break;
					}
				}
			}
		}
		if(ans)
		{
			if(a.size()>b.size())
			{
				cout<<a.size()<<' '<<b.size()<<endl;
			}
			else
			{
				cout<<b.size()<<' '<<a.size()<<endl;
			}
		}
		else
		{
			cout<<"Poor wyh"<<endl;
		}
	}
	return 0;
}

					


第一次在比赛遇到超内存的情况[比赛参加得太少了],刚开始都用int型,然后想了半天试着char型应该能减少内存,但是发现改完后已经21:01(结束时间为 21:00),

没来得及提交代码了。   不过这次又学了不少东西。

你可能感兴趣的:(BestCoder)