題意:
給乙個無線迴圈小數的前幾位,給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])中的最大就是答案
#includeusingnamespace
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;
}
待補全模板
intnext[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 如果不能,說明還需要...