hdu4662 简单搜索打表
生活随笔
收集整理的這篇文章主要介紹了
hdu4662 简单搜索打表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一個初始串"MI",這個串有三種操作,
(1)M后賣弄可以直接復制 ,MI -> MII
(2)三個III可以變成一個U,MUIII -> MUU
(3)連續的兩個U可以直接刪除,MIUUU -> MIU
每次輸入一個字符串,問你這個字符串是不是MI變過來的.
?
思路:
? ? ?給你一個初始串"MI",這個串有三種操作,
(1)M后賣弄可以直接復制 ,MI -> MII
(2)三個III可以變成一個U,MUIII -> MUU
(3)連續的兩個U可以直接刪除,MIUUU -> MIU
每次輸入一個字符串,問你這個字符串是不是MI變過來的.
?
思路:
? ? ?剛開始想都沒想直接開個容器mark,然后搜索打表,控制的長度是1000000,直接敲完運行等了好幾分鐘都沒打完,哎! sb了,后來仔細看了看題目發現 其實我們可以這樣想,所有的U都是i經過一線變化過來的,因為剛開始的時候沒有U,而i能變成u而u不能變成i,還有的就是這個串一定是開頭是M,因為沒有操作能讓中間產生m,或者把M變沒,這樣就簡單了,那么就相當于一開始有一個i,我們可以把i的個數*2(操作1) 或者把i的個數-6 (操作3),這樣所有的可能i的個數都打出來,沒多少1--300000個,對于輸入的串我們先看下是不是只有開頭有一個M,然后在統計下他有多少個i,一個u是三個i(還原操作2),然后根據當前的i的數量是否被mark輸出Yes或者No,水題一枚.
#include<stdio.h> #include<string.h>#define N 1000100 char str[N]; int mark[N*3];void DFS(int s) {mark[s] = 1;if(s * 2 <= N * 3 && !mark[s * 2]) DFS(s * 2);if(s - 6 >= 1 && !mark[s - 6])DFS(s - 6); }int main () {memset(mark ,0 ,sizeof(mark));DFS(1);int L ,ms ,t ,sum;scanf("%d" ,&t);while(t--){scanf("%s" ,str);L = strlen(str);ms = sum = 0;for(int i = 0 ;i < L ;i ++){if(str[i] == 'M') ms ++;if(i){if(str[i] == 'I')sum ++;else sum += 3;}}if(ms != 1 || str[0] != 'M' || !mark[sum])puts("No");else puts("Yes");}return 0; }
總結
以上是生活随笔為你收集整理的hdu4662 简单搜索打表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu3756 三分求最小圆锥
- 下一篇: hdu1007 最近点对