【HDOJ 1009】 CRB and String
阿新 • • 發佈:2017-06-27
.cn 出現 滿足 ron urn str sca 發現 size
【HDOJ 1009】 CRB and String
每組兩個串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; }
【HDOJ 1009】 CRB and String