日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)

發(fā)布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

luogu 1019


題目大意

給你若干個詞語,讓你把他們連起來(重復(fù)段疊在一起),每個詞語最多用兩次,問你該串最長是多少


解題思路

dfs枚舉一個單詞后面接哪個單詞,然后枚舉重疊長度,再用hash判斷是否相同


代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 200 using namespace std; int n, ans, l[N], p[N]; unsigned long long pw[N], hs[N][N]; char s[N][N]; void dfs(int x, int sum) {ans = max(ans, sum);for (int i = 1; i <=n; ++i){if (p[i] == 2) continue;int g = 0;for (int len = 1; len <= min(l[x], l[i]) - 1; ++len){int j = l[x] - len;if (hs[x][l[x]] - hs[x][j] * pw[len] == hs[i][len])//判斷是否相等{g = len;//最短的長度break;}}if (g){p[i]++;//記錄使用次數(shù)dfs(i, sum + l[i] - g);p[i]--;}}return; } int main() {scanf("%d", &n);pw[0] = 1;for (int i = 1; i <= 1000; ++i)pw[i] = pw[i - 1] * 131;for (int i = 1; i <= n; ++i){scanf("%s", s[i]+1); l[i] = strlen(s[i]+1);hs[i][0] = 0;for (int j = 1; j <= l[i]; ++j)hs[i][j] = hs[i][j - 1] * 131 + s[i][j];}scanf("%s", s[0]+2);s[0][1] = '/';l[0] = strlen(s[0]+1);hs[0][0] = 0;for (int j = 1; j <= l[0]; ++j)hs[0][j] = hs[0][j - 1] * 131 + s[0][j];dfs(0, 1);printf("%d", ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。