①、trie樹上的節點多記乙個rest值表示還有多少個串沒被用。列舉所有串, 每次先在trie上跑匹配串,看一看那個點的rest。如果沒法匹配的話就往trie裡插入原串,把結束節點的rest+1
②、思路和trie類似。其實就是把trie換成hash。(把在樹上跑換成去hash值)
③、將每個序列的個數存下,每次讀入時判斷對應序列的map的權值是否為0,若不為0,將輸入序列和其對應序列的map權值-- ,ans++
下面是第三種解法 :
1 #include2view codeusing
namespace
std;
3#define ll long long
4#define inf 0x3f3f3f
5ll read()614
void
out(int
a)15
21if(a>=10)out(a/10
);22 putchar(a%10+'0'
);23
}24 maphaha;
25int
n;26 mapab;
27int
main()
2849
//cout<50
if(haha[b]!=0)51
56}57 cout
59return0;
60 }
因為n是<=1e19的,而long long是存不到大於777777777444444444的下乙個幸運數,所以當n>777777777444444444,我們要進行特判。
剩下的情況的最大的幸運數則為777777777444444444。
因為幸運數肯定為偶數,且只包含4、7且4、7個數相同,所以打表完我們會發現 在long long可存的範圍下幸運數並不多
所以我們將所有幸運數存入arr[ ]陣列中,最後再對arr[ ]和n進行二分查詢,返回大於等於n的第乙個幸運數(打表時注意遞迴方式使陣列arr[ ]預設從小到大排序)
下面貼**:
1 #include2view codeusing
namespace
std;
3#define ll long long
4#define inf 0x3f3f3f
5ll read()614
void
out(ll a)
1521
if(a>=10)out(a/10
);22 putchar(a%10+'0'
);23}24
const
int n = 1e6+10;25
int k = 1
,t;26
ll n;
27ll arr[n];
28void dfs(int num4,int
num7,ll ans)
2935
else
if(num4 == 0)36
39else
if(num7 == 0)40
43else
4448}49
intmain()
5064
int r =k;
65int l = 1;66
while(r - l > 0)67
75 cout
77return0;
78 }
牛客NOIP暑期七天營 提高組3
今天是被打爆的一天,t3就是用正解做的,但是好像zz了,只得了30分。t1由於沒判不合法的情況,也只有15分 果然是乙個拿不到noip一等獎的人 畢竟noip都準備改名了?a 破碎的矩陣。題意 給出n,m,表示有n m的矩陣,然後給定每一行的異或和,每一列的異或和,求方案數。思路 如果合法,方案數是...
暑期七天魔鬼訓練營
第一天 1 luogu 2871 poj3624 charm bracelet 手鍊 01揹包 狀態壓縮 2 poj 1384 piggy bank 完全揹包 3 poj 2387 the cows come home 最短路徑模板 4 poj 3255 次短路 5 poj 3723 conscri...
牛客CSP S提高組賽前集訓營2
然後隨便用乙個資料結構維護一下就行了,我寫的線段樹。我們先找出每個環,然後我們先刪連線環的邊,每刪一條就可以多產生乙個聯通塊,在考慮刪環邊,發現從最大的環刪起一定最優 因為你刪的第一條邊得不到任何新的聯通塊 就很容易想到tar jantarjan tarjan 發現你只能寫出80 8080 分,因為...