【HDOJ 1009】 CRB and String
2015-08-20 18:18
369 查看
【HDOJ 1009】 CRB and String
每组两个串s t 只由小写字母组成 问从s能不能变成t
改变的操作为选一个字符 在后面加上一个与所选字符不同的字符
这种操作可以做无数次 问能不能达t
首先s能到t的首要条件是 对于任意字母 s中出现的次数小于等于t中出现的次数
其次仔细想想可以发现 满足上一条件后 如果不存在连续的相同字符 s肯定能变成t(仔细想想
而相同的连续字符如果在串中(不在串首 可不断在其前的字符后累加该字符
因此只需看t开头有没有连续的相同字符 如果与s开头连续的相同字符为同一字符 并且长度小于等于s开头的连续相同字符长度
即为Yes
不满足以上两个条件 即为No
代码如下:
每组两个串s t 只由小写字母组成 问从s能不能变成t
改变的操作为选一个字符 在后面加上一个与所选字符不同的字符
这种操作可以做无数次 问能不能达t
首先s能到t的首要条件是 对于任意字母 s中出现的次数小于等于t中出现的次数
其次仔细想想可以发现 满足上一条件后 如果不存在连续的相同字符 s肯定能变成t(仔细想想
而相同的连续字符如果在串中(不在串首 可不断在其前的字符后累加该字符
因此只需看t开头有没有连续的相同字符 如果与s开头连续的相同字符为同一字符 并且长度小于等于s开头的连续相同字符长度
即为Yes
不满足以上两个条件 即为No
代码如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; using namespace std; char s[100005],t[100005]; int sz[26],tz[26]; int main() { int T,i,j,lens,lent; bool f; scanf("%d",&T); while(T--) { scanf("%s %s",s,t); if(s[0] != t[0]) { puts("No"); continue; } memset(sz,0,sizeof(sz)); memset(tz,0,sizeof(tz)); lens = lent = 0; f = 0; for(i = 0; s[i]; ++i) { sz[s[i]-'a']++; if(!f && (!i || s[i] == s[i-1])) lens++; else f = 1; } f = 0; for(i = 0; t[i]; ++i) { tz[t[i]-'a']++; if(!f && (!i || t[i] == t[i-1])) lent++; else f = 1; } if(t[0] == s[0] && lens >= lent) { for(i = 0; i < 26; ++i) { if(sz[i] > tz[i]) break; } if(i == 26) puts("Yes"); else puts("No"); } else puts("No"); } return 0; }
相关文章推荐
- Memcache学习php完整一例
- 一个简单的appium脚本
- MyBatis动态SQL详解
- python版的mapreduce程序运行在hadoop上
- js制作台球游戏
- 黑马程序员——面向对象
- POJ2154 Color【Polya定理】【欧拉函数】【整数快速幂】
- 使用JavaScript判断输入的内容是否为空,应该注意的一点!
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
- C++ 头文件
- Memcache学习笔记
- hadoop的插件的配置
- 菜单悬浮
- 无题
- php中$this->是什么意思
- Struts学习笔记——01
- CoreAnimation(CA)
- MR案例:Reduce-Join
- Android性能优化典范 - 第3季
- 表格显示问题