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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://acm.hdu.edu.cn/showproblem.php?

pid=4850

題意:構造長度為n的字符序列。使得>=4的子串僅僅出現一次

事實上最長僅僅能構造出來26^4+4-1= 456979 的序列,大于該數的都是不可能的。構造方法。就是那種歐拉回路的序列,此題DFS會爆棧。手動擴展棧也能夠AC......

遞歸形式的開始WA了。沒有細調就換非遞歸了,后來又想了想,盡管自己電腦上執行不了。可是先把長度按小的來。然后調試代碼,然后在擴大,AC了,當時錯在MOD,遞歸的MOD應該是26^4。而不是26^4+1,由于控制在0~(26^4-1)范圍內,就是456976個數

所以要變成非遞歸,我事實上不太理解非遞歸的,然后參考自己曾經做過的也是不太理解的這個代碼http://blog.csdn.net/u011026968/article/details/38151303

然后AC

非遞歸版 ?46ms AC

//#pragma comment(linker, "/STACK:102400000,102400000") //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include <iomanip> #include <cmath> #include <map> #include <set> #include <queue> using namespace std;#define ls(rt) rt*2 #define rs(rt) rt*2+1 #define ll long long #define ull unsigned long long #define rep(i,s,e) for(int i=s;i<e;i++) #define repe(i,s,e) for(int i=s;i<=e;i++) #define CL(a,b) memset(a,b,sizeof(a)) #define IN(s) freopen(s,"r",stdin) #define OUT(s) freopen(s,"w",stdout) const ll ll_INF = ((ull)(-1))>>1; const double EPS = 1e-8; const int INF = 100000000; const int MAXN = 101; const int S = 500000; const int SIZE = 26; const int LEN = 456976+3; //const int MOD = 456976; const int MOD =17576;char str[LEN+10]; char li[LEN*SIZE+10]; int sta[LEN*SIZE+10];/*int dfs(int cnt, int s) {//printf("cnt=%d %d\n",cnt,s);if(cnt == LEN)return 1;for(int i=0;i<SIZE;i++){if(!vis[(s*SIZE+i)%MOD])///{vis[(s*SIZE+i)%MOD]=1;str[cnt]=i;if(dfs(cnt+1, (s*SIZE+i)%MOD))return 1;//vis[(s<<1)+i]=0;}}return 0; }*/ int tp,ans; void sea(int v) {while(li[v]<SIZE){int w=v*SIZE+li[v];li[v]++;sta[tp++]=w;v=w%MOD;} } void solve() {CL(str,0);CL(li,0);tp=0;int v;sea(0);str[0]='a';ans=1;while(tp){v=sta[--tp];str[ans++]=v%SIZE+'a';v/=SIZE;sea(v);} }int main() {//OUT("hdu4850.txt");solve();int n;while(~scanf("%d",&n)){if(n>LEN)puts("Impossible");else{if(n<=4){for(int i=0;i<n;i++)putchar('a');}else{for(int i=1;i<4;i++)putchar('a');int tt=ans;n-=3;while(tt>ans-n)putchar(str[--tt]);}putchar('\n');}}return 0; }

遞歸版 93ms AC

#pragma comment(linker, "/STACK:102400000,102400000") //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include <iomanip> #include <cmath> #include <map> #include <set> #include <queue> using namespace std;#define ls(rt) rt*2 #define rs(rt) rt*2+1 #define ll long long #define ull unsigned long long #define rep(i,s,e) for(int i=s;i<e;i++) #define repe(i,s,e) for(int i=s;i<=e;i++) #define CL(a,b) memset(a,b,sizeof(a)) #define IN(s) freopen(s,"r",stdin) #define OUT(s) freopen(s,"w",stdout) const ll ll_INF = ((ull)(-1))>>1; const double EPS = 1e-8; const int INF = 100000000; const int MAXN = 101; const int S = 500000; const int SIZE = 26; const int LEN = 456976+3; const int MOD = 456976;int str[LEN+10]; int vis[LEN+10];int dfs(int cnt, int s) {//printf("cnt=%d %d\n",cnt,s);if(cnt == LEN)return 1;for(int i=0;i<SIZE;i++){if(!vis[(s*SIZE+i)%MOD])///{vis[(s*SIZE+i)%MOD]=1;str[cnt]=i;if(dfs(cnt+1, (s*SIZE+i)%MOD))return 1;}}return 0; }void init() {CL(str,0);CL(vis,0);vis[0]=1;dfs(4,0); }int main() {//OUT("hdu4850.txt");init();int n;while(~scanf("%d",&n)){if(n>LEN)puts("Impossible");else{for(int i=0;i<n;i++)putchar(str[i]+'a');putchar('\n');}}return 0; }

總結

以上是生活随笔為你收集整理的hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。