hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现
生活随笔
收集整理的這篇文章主要介紹了
hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://acm.hdu.edu.cn/showproblem.php?
pid=4850
題意:構(gòu)造長度為n的字符序列。使得>=4的子串僅僅出現(xiàn)一次
事實上最長僅僅能構(gòu)造出來26^4+4-1= 456979 的序列,大于該數(shù)的都是不可能的。構(gòu)造方法。就是那種歐拉回路的序列,此題DFS會爆棧。手動擴展棧也能夠AC......
遞歸形式的開始WA了。沒有細(xì)調(diào)就換非遞歸了,后來又想了想,盡管自己電腦上執(zhí)行不了。可是先把長度按小的來。然后調(diào)試代碼,然后在擴大,AC了,當(dāng)時錯在MOD,遞歸的MOD應(yīng)該是26^4。而不是26^4+1,由于控制在0~(26^4-1)范圍內(nèi),就是456976個數(shù)
所以要變成非遞歸,我事實上不太理解非遞歸的,然后參考自己曾經(jīng)做過的也是不太理解的這個代碼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; }總結(jié)
以上是生活随笔為你收集整理的hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js弹性运动滑动的菜单
- 下一篇: win7安装laravel