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(1≤T≤105) 。 接下来 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 个小学生,编号为 1−n 。为了增加小学生之间的凝聚力,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) 只会出现一次。 T≤10,0≤n,m≤100000
对于每组数据,输出答案。
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),
没来得及提交代码了。 不过这次又学了不少东西。