HDU 6740 kmp最小迴圈節

2022-05-06 21:24:09 字數 1471 閱讀 8742

題意:

給乙個無線迴圈小數的前幾位,給n,m

選擇其中一種出現在前幾位的迴圈節方式(a個數),迴圈節的長度b

使得n*a-m*b最大

樣例:2 1

12.1212

輸出 6 

選擇2,2*1-1*1=1;

選擇12,2*4-2*1=6;

選擇21,2*3-2*1=4;

選擇212,2*3-3*1=3;

選擇1212,2*4-4*1=4;

思路:將小數部分,倒過來,求每個點的最小迴圈節,kmp中i-next[i]代表最小迴圈節

當倒過來的小數部分,n*i-m*(i-next[i])中的最大就是答案

#includeusing

namespace

std;

#define ll long long

#define il inline

#define it register int

#define inf 0x3f3f3f3f

#define lowbit(x) (x)&(-x)

#define mem(a,b) memset(a,b,sizeof(a))

#define mod 998244353

const

int maxn=1e7+10

;ll n,m;

intnexts[maxn];

char

s[maxn],s2[maxn];

int p2=0

;il

void getnext(int

l)

else

j =nexts[j];

}return;}

intmain()

}for(int k=l-1;k>i;k--)

getnext(p2);

ll maxx=-1e18;

for(i=1;i<=p2;i++)

printf(

"%lld\n

",maxx);

}return0;

}

kmp模板

inline void getnext(char *ss)

else

}return;}

inline

int kmp(char *ss,char *s)

else

j=ne[j];

if(j==ls)

}return

ans;

}

待補全模板

int

next[maxn];

string

str[maxn];

void get_next(strings)}

bool kmp(string a,string

b)

return

false

;}

HDU3746 KMP 最小迴圈節

最小迴圈節求法 定理 假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len next len 子串為s 0 len next len 1 1 如果len可以被len next len 整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t len l。2 如果不能,說明還需要再新增幾個字...

hdu3746(kmp最小迴圈節)

題意 問在乙個字串末尾加上多少個字元能使得這的字串首尾相連後能夠迴圈 題解 就是利用next的性質求最小迴圈節 kmp求最下迴圈節 ans len next len ans就是最小迴圈節長度證明看那個部落格。然後就簡單了。include include include using namespace...

kmp求最小迴圈節

kmp最小迴圈節 迴圈週期 定理 假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len next len 子串為s 0 len next len 1 1 如果len可以被len next len 整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t len l。2 如果不能,說明還需要...