锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>/*
闂畁<=10^18鏄惁鑳借涓涓暟鐨勫鉤鏂規暣闄?br />
灝唍鍒嗚В涓猴細p1p2
pk 鍏朵腑pi涓虹礌鏁幫紝涓攑i<=pi+1錛堣繖閲屽彲浠ョ瓑浜庯級
鑻鑳借涓涓暟鐨勫鉤鏂規暣闄わ紝瀹冭偗瀹氳兘琚竴涓礌鍥犲瓙鐨勫鉤鏂筽^2鏁撮櫎錛屾垜浠壘鍒版渶灝忕殑榪欎釜p鍗沖彲 ~~~
1.濡傛灉p涓嶆槸鏈鍚庣殑绱犲洜瀛愶紝鍦╬涔嬪悗鐨勭礌鏁皃i>=p錛岃繖鏃跺氨鏈塶>=p^3浜嗭紝
鍗硃<=n^(1/3)錛屾墍浠ユ灇涓緉^(1/3)鍐呯殑绱犳暟鐪嬫槸鍚^2|n鍗沖彲錛岃宯^(1/3)<=10^6
2.濡傛灉p鏄渶鍚庣殑绱犲洜瀛愶紝鎵浠鐨勫艦寮忓氨鏄痯1p2
p'p^2錛岃宲'<=p錛屾墍浠'^3<=n錛宲'<=n^(1/3)
鎵浠ュ彲浠ュ厛灝唍鐨勮繖浜涚礌鍥犲瓙p1,p2,
,p'緇欏幓鎺夛紝p'<=n^(1/3)錛屾墍浠ョ敤n^(1/3)鍐呯殑绱犳暟鍘婚櫎鍗沖彲
鏈鍚庡彧鍓╀笅n'=p^2錛岄氳繃鍒ゆ柇涓涓暟鏄惁涓哄畬鍏ㄥ鉤鏂規暟鍗沖彲
綆楁硶灝辨槸棰勫鐞?0^6鍐呯殑绱犳暟錛岀敤榪欎簺绱犳暟鍘婚櫎n錛屽彂鐜版湁p^2鑳芥暣闄ょ殑return鍗沖彲
鍚﹀垯鍒ゆ柇鍓╀笅鐨勮繖涓猲'鏄惁涓哄畬鍏ㄥ鉤鏂規暟錛屾垜鏄敤浜屽垎鍒ゆ柇鐨勶紝鍔犱簡double澶勭悊long long 婧㈠嚭
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<iostream>
#include<cassert>
using namespace std;
bool isp[1000010];
int pr[300000], pn;
void init()
{
for (int p = 2; p <= 1000000; p++) {
if (!isp[p]) {
pr[pn++] = p;
for (long long j = (long long)p*p; j <= 1000000; j+= p) {
isp[j] = 1;
}
}
}
}
// n = p1p2
pk
bool chk(long long n)
{
for (int i = 0; i < pn && pr[i] <= n; i++) {
if (n % pr[i] == 0) {
n /= pr[i];
if (n%pr[i] == 0) return 0;
}
}
if (n == 1) {
return 1;
}
long long left = 1, right = n;
while (left <= right) {
long long mid = (left + right) / 2;
if ((double)mid*mid > n) right = mid - 1;//double !!
else left = mid+1;
}
return right*right != n;
}
int main()
{
//freopen("in.txt", "r", stdin);
init();
int T, t = 1;
for (scanf("%d", &T); T--; ) {
printf("Case %d: ", t++);
long long n;
scanf("%I64d", &n);
puts(chk(n) ? "Yes" : "No");
}
return 0;
}
]]>
緇欏嚭n<=50000涓暟鐨勫簭鍒梐[1]..a[n]錛屾眰涓涓潪閫掑噺鐨勫簭鍒梑[1]..b[n]
浣垮緱∑|a[i]-b[i]|鏈灝?br />
濡傛灉鍙槸姹備竴涓偣x錛屼嬌寰?#8721;|a[i]-b[i]|鏈灝忥紝鏄劇劧x = a[(n+1)/2]錛堜腑浣嶆暟錛?--------------OMG
浣嗙幇鍦ㄥ彲浠ユ湁澶氫釜鐐癸紝濡傛灉a[]鏄掑鐨勶紝閭d箞浠[i] = a[i]鍗沖彲浜?br />
鐜板湪a[]鏄棤瑙勫緥鐨?br />
宸﹀亸鏍戠殑璁烘枃棰橈紝鐪嬩簡璁烘枃榪樹笉瀹屽叏鎳?br />
鍋氭硶錛?br />
鏈鍚庣瓟妗堢殑褰㈠紡鏄皢1..n鍒嗘垚m涓繛緇殑鍖洪棿錛屾瘡涓尯闂寸殑b[i]鏄竴鏍風殑錛屼笖涓嶅悓鍖洪棿鏄潪閫掑噺鐨?br />
鍦ㄦ鏌鏃訛紝鍋囪1..n-1宸茬粡鍒嗘垚浜唌涓尯闂翠簡
鐜板湪鍏堟妸a[n]鍗曠嫭涓涓尯闂達紝鏄劇劧b[n]=a[n]浼氭槸1..n鐨勬渶浼樺鹼紙鍥犱負鍓嶉潰1..n-1鏄渶浼樼殑錛岃岀n涓?br />
瀵圭瓟妗堢殑璐$尞涓?錛夛紝浣嗘槸涓嶄竴瀹氭弧瓚砨[n-1]<=b[n]錛岀畻娉曚負錛?br />
鑻[n-1] <= b[n]錛屽垯b[n]灝辨槸a[n]浜?br />
鍚﹀垯錛岄渶瑕佸悎騫剁洰鍓嶆渶灝劇殑涓や釜鍖洪棿錛岀洿鑷寵繖涓や釜鍖洪棿鏈塨[k] <= b[k+1] -------OMG
鑰宐[k]鏄劇劧鏄瘡涓涓尯闂寸殑涓綅鏁頒簡
鍚堝茍涓や釜鍖洪棿姹備腑浣嶆暟錛屽彲鐢ㄥ乏鍋忔爲鍋氭渶澶у爢鍒嗗埆緇存姢姣忎釜鍖洪棿鐨勫墠(ni+1)/2灝忕殑鏁幫紝-------OMG
鍒欏爢欏朵負姣忎釜 鍖洪棿鐨勪腑浣嶆暟浜嗭紝鍚堝茍鏃訛紝灝嗗彸杈瑰尯闂寸殑閭d簺鏁板悎騫跺埌宸﹁竟鍗沖彲
O(nlogn)
宸﹀亸鏍戠湡鏄濂囨紓浜殑涓滆タ!!
鑷充簬涓轟粈涔堟槸鍚堝茍鏈鍚庝袱涓尯闂達紝灝嗙n涓暟鍜屽畠涔嬪墠閭d釜鍖洪棿鐨勪竴閮ㄥ垎鏁板悎璧鋒潵涓嶈鍚楋紵
鍋囪a[kn-1]鏄眰鍑烘潵鐨勪竴涓尯闂達紝鍒欒偗瀹氭湁a[n-1]<a[k..n-2]鐨勪腑浣嶆暟錛屽惁鍒欏皢a[n-1]鐙珛鍑烘潵浼氭洿浼?--OMG
鍚岀悊錛宎[n]<a[k..n-1]鐨勪腑浣嶆暟錛岄渶瑕佽繘琛屽悎騫訛紝閭h兘涓嶈兘a[kn]鍒嗘垚涓ら儴鍒嗭紝鑰屼笉鏄悎騫舵垚涓閮ㄥ垎鍛紵
鍗砤[k..k'], a[k'..n]錛岃繖鏍蜂篃涓嶈錛岀敱鍋囪鐭ワ紝鑲畾a[k'..n]鐨勪腑浣嶆暟<a[k..k']鐨勪腑浣嶆暟錛岄渶瑕佸悎騫?br />
錛堝ぇ浜庣殑璇濓紝a[k'+1..n-1]灝變笉浼氬悎騫跺埌閭i噷鍘誨暒~~錛?br />
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
const int MAXN = 100010;
struct Node
{
int key, dist, lc, rc;
};
Node nodes[MAXN];
int alloc;
void initNode()
{
nodes[0].dist = -1;//0浣滀負NULL鑺傜偣
alloc = 1;
}
int newNode(int x)
{
nodes[alloc].key = x;
nodes[alloc].dist = 0;
nodes[alloc].lc = nodes[alloc].rc = 0;
return alloc++;
}
int merge(int A, int B)
{
if (A != 0 && B != 0) {
if (nodes[A].key < nodes[B].key) {//
swap(A, B);
}
nodes[A].rc = merge(nodes[A].rc, B);
int &lc = nodes[A].lc;
int &rc = nodes[A].rc;
if (nodes[lc].dist < nodes[rc].dist) {
swap(lc, rc);
}
nodes[A].dist = nodes[rc].dist + 1;
} else {
A = A == 0 ? B : A;
}
return A;
}
int pop(int A)
{
int t = merge(nodes[A].lc, nodes[A].rc);
nodes[A].lc = nodes[A].rc = 0;//闅旂鍑篈鍚庤寰楀皢A鐨勫効瀛愪篃娓呯┖
return t;
}
int a[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
for (int n;scanf("%d", &n), n; ) {
initNode();
stack<pair<int,int> > S;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
pair<int, int> np(newNode(a[i]), 1);//node, len
while (!S.empty() && nodes[S.top().first].key > nodes[np.first].key) {
pair<int,int> top = S.top();
S.pop();
int n1 = top.second, n2 = np.second;
np.first = merge(top.first, np.first);
np.second = n1+n2;
if ((n1+1)/2 + (n2+1)/2 > (n1+n2+1)/2) {
np.first = pop(np.first);
}
}
S.push(np);
}
long long ans = 0;
int id = n;
while (!S.empty()) {
int b = nodes[S.top().first].key, num = S.top().second;
S.pop();
while (num -- > 0) {
ans += abs(a[id--] - b);
}
}
printf("%lld\n", ans);
}
return 0;
}
]]>
涓篬l,r]鍖洪棿鍐呮湁澶氬皯涓暟鏄尯闂碵x,y]涓殑鏁扮殑鍜?br /> 1 <= x, y, l, r <= 10^8 x <=y, l <= r
濡傛灉鑼冨洿娌¤繖涔堝ぇ鐨勮瘽錛屽[x,y]榪檡-x+1涓墿鍝佽繘琛屽畬鍏ㄨ儗鍖咃紝鎵懼嚭瑕嗙洊浜嗛偅浜涗綅緗?br /> 鐜板湪鏁版嵁榪欎箞澶э紝鑳屽寘涓嶅彲琛?br /> 浣嗘槸錛屾敞鎰忓埌[x,y]榪欐槸涓涓繛緇殑鍖洪棿錛屽彲浠ョ畻鍑轟粬浠細瑕嗙洊鐨勬暟鏄細
[x,y] , [2x,2y] [kx, ky]
榪欐牱鐨勮瘽錛屾垜浠鎵炬弧瓚砙l,r]涓殑鏁幫紝鍙鐢╢[r] - f[l-1]
f[x]琛ㄧず[1,x]涓涓婇潰閭d簺鏁拌鐩栫殑涓暟
瑕佹敞鎰忕殑鏄紝鏈夊彲鑳絒(k-1)x, (k-1)y]涓嶽kx,ky]鏈夐噸鍙犻儴鍒嗭紙鍗?k-1)y>=kx錛?br /> 鍙涓寮濮嬮噸鍙犱簡錛屼箣鍚庣殑鎵鏈夌偣閮戒細琚鐩栦簡
鏁版嵁姣旇緝澶э紝鏈変簺鍒ゆ柇闇瑕佺敤double
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
long long gao(long long x, long long y, long long z, long long k)
{
long long l = 0, r = z;
while (l <= r) {//find first l*y >= z
long long m = (l+r)/2;
if ((double)m*y < z) l = m+1;//瑕佺敤double
else r = m-1;
}
long long ans = 0;
//[x,y] [2x,2y] [(l-1)x, (l-1)y], [lx, ly]
if (l >= k) {
ans = (y-x)*(k-1)*k/2 + (k-1) + (k*x > z ? 0 : z-k*x+1);
} else {
ans = (y-x)*(l-1)*l/2 + (l-1) + (l*x > z ? 0 : z-l*x+1);
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
for (long long x, y, l, r; cin>>x>>y>>l>>r; ){
if (r < x ) {
cout<<0<<endl;
continue;
}
if (x == y) {
cout<<r/x - (l-1)/x << endl;
continue;
}
long long lk = 1, rk = y;
while (lk <= rk) {
long long mk = (lk+rk)/2;
//瑕佺敤double
if ((double)mk*x > ((double)mk-1)*y) lk = mk + 1;
else rk = mk-1;
}
//[rk*x, oo)
cout<<gao(x, y, r, rk) - gao(x, y, l-1, rk)<<endl;
}
return 0;
}
]]>
涓涓嚫澶氳竟褰<=10000錛宑ut浜唌嬈★紝姣忎竴鍒涓嶇浉浜?br /> 姹傝竟鏁版渶澶氶偅鍧楃殑杈規暟
榪欓鐢ㄩ敊璇殑鍋氭硶鎼炰簡寰堜箙錛屾氮璐瑰ぇ閲忔椂闂達紝鍥?img src="http://www.shnenglu.com/Images/dot.gif" alt="" />
鐒跺悗媧楁盡鏃舵兂鍒頒簡鍙互閫氳繃姣忔鎵句竴涓?#8220;鏈灝忕殑鐜?#8221;鏉ュ仛
綾諱技錛?br /> http://watashi.ws/blog/970/andrew-stankevich-3-solution/
zoj 2361
涓婇潰榪欓鍗佸垎鎺ㄨ崘錛侊紒錛?br />
涓婇潰閭i鏄寜鐓ф瀬瑙掓帓搴忥紝涓嶈繃榪欓鍙互鎸夌収鐐圭殑緙栧彿鎺掑簭鍗沖彲
澶氳竟褰㈢殑欏剁偣鐪嬫垚鍥劇殑欏剁偣錛屽杈瑰艦鐨勮竟鏄竟錛宑ut涔熺湅鎴愯竟錛堝弻鍚戠殑杈癸級
寤哄ソ鍥懼悗錛屽姣忎釜鐐規壘瀹冩墍鍦ㄧ殑鐜紙鍙兘澶氫釜錛?br /> 姣斿鐜板湪宸茬粡鏈夎竟pre->now錛岄偅涔堝氨鍦╪ow鐨勯偦鎺ヨ竟涓壘絎竴涓瘮pre灝忕殑鐐?br /> 錛堟病鏈夌殑璇濓紝灝辨渶澶ч偅涓級
榪欐牱錛岃蛋鍑虹殑鐜氨鏄渶灝忕殑浜嗭紙涔熷嵆鐜唴娌℃湁杈癸級
鐢諱釜鍥懼氨娓呮浜?br /> 8 4
2 8
2 4
4 6
6 8
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 10086;
vector<int> e[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
for (int N, M; ~scanf("%d%d", &N, &M); ) {
for (int i = 1; i <= N; i++) {
e[i].clear();
e[i].push_back(i == N ? 1 : i+1);
//e[i].push_back(i == 1 ? N : i-1);榪欐潯杈逛笉鐢ㄥ姞
}
int x, y;
for (int i = 0; i < M; i++) {
scanf("%d%d", &x, &y);
if (x > y) swap(x, y);
//鍙屽悜鐨勮竟
e[x].push_back(y);
e[y].push_back(x);
}
for (int i = 1; i <= N; i++) {
sort(e[i].begin(), e[i].end());
}
int ans = 0;
for( int i = 1; i <= N; i++) {
//cout<<endl<<i<<": \n";
for (vector<int>::iterator it = e[i].begin(), jt; it != e[i].end(); ) {
int pre = i, now = *it, len = 1;
//姣忔鍦╪ow涓鎵劇涓涓皬浜巔re鐨勶紝榪欐牱灝辨槸鏈灝忕殑鐜簡錛岀被浼兼瀬瑙掓渶灝?/span>
while (now != i) {
//cout<<pre<<" "<<now<<endl;
len ++;
jt = lower_bound(e[now].begin(), e[now].end(), pre);
//涓嶈兘鍐欐垚--jt < e[now].begin()錛屽洜涓?-jt涓嶅啀灞炰簬e[now]鐨勮寖鍥翠簡
if (jt == e[now].begin()) {
jt = --e[now].end();
} else jt --;
pre = now;
now = *jt;
e[pre].erase(jt);
}
it = e[i].erase(it);
//cout<<len<<endl;
ans = max(ans, len);
}
}
printf("%d\n", ans);
}
return 0;
}
]]>
鍗氬紙娓告垙
2鍒?0鐨勬暟錛屼袱涓漢杞祦鍙?br /> 鍙栨暟涓嶈兘鍙栦箣鍓嶅凡鍙栬繃鏁扮殑鍊嶆暟錛屾垨涔嬪墠鍙栬繃鐨勪袱涓暟鐨勫嶆暟涔嬪拰
緇欏嚭褰撳墠鐨勪竴涓悎娉曞眬闈紝闂厛鎵嬭璧㈢殑絳栫暐
n<=20錛屾瘮杈冩槑鏄劇殑mask dp
dp[mask]琛ㄧず鍓╀笅mask琛ㄧず鐨勬暟錛屽綋鍓嶄笅鎵嬫槸璧㈣繕鏄緭
娉ㄦ剰鐨勬槸錛屽case錛屼絾鏄彧綆椾竴嬈″氨琛屼簡錛屼笉鐢ㄦ瘡涓猚ase閮絚lear dp[]
鍥犱負鐭ラ亾浜嗗綋鍓嶅眬闈紝灝辮兘紜畾涔嬪墠閫変簡浠涔堟暟浜?br />*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
char dp[1<<20];
void add(int &forbiden, int &multiple, int x)//forbiden涓轟笉鑳界殑浣嶏紝multiple涓轟箣鍓嶉夌殑閭d簺鏁扮殑鍊嶆暟鐨勪綅
{
for (int a = x; a <= 20 ; a += x) {
forbiden |= 1<<a;
multiple |= 1<<a;
forbiden |= multiple<<a;
}
}
bool win(int mask, int forbiden, int multiple, int x)
{
if (mask == 0) {
dp[mask] = -1;
return false;
}
if(dp[mask]) {
return dp[mask] > 0;
}
add(forbiden, multiple, x);
for (int i = 2; i <= 20; i++) {
if((mask & (1<<i-2)) == 0 || (forbiden&(1<<i)) )continue;
if (!win(mask ^ (1<<i-2), forbiden, multiple, i) ) {//榪欓噷鎻愬墠閫鍑轟簡錛屾湁浜涘瓙鐘舵佸茍娌℃湁綆楀埌
return dp[mask] = 1;
}
}
dp[mask] = -1;
return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
int T, t = 1, n;
for (scanf("%d", &T); T--; ) {
printf("Scenario #%d:\n", t++);
scanf("%d", &n);
vector<int> vt, have;
int vi[30] = {0}, mask = 0;
for (int i = 1,x; i <= n; i++) {
scanf("%d", &x);
vt.push_back(x);
vi[x] = 1;
mask |= 1<<(x-2);//
}
int forbiden = 0, multiple = 0;
for (int i = 2; i <= 20; i++) {//緇欏嚭涓涓暟錛岃偗瀹氱粰鍑轟粬鐨勬墍鏈夊洜瀛?/span>
if (vi[i] || (forbiden & (1<<i)) ) continue;
add(forbiden, multiple, i);
}
// fill(dp, dp+mask+1, 0); 涓嶇敤姣忔閮絚lear
/*
涓嶈鎼炰竴嬈in(mask)
鐒跺悗鍙杁p[mask ^ (1<<vt[i]-2)錛岀湅win閲岄潰浼氭彁鏃╅鍑虹殑
鎵浠ユ湁浜沝p[mask']娌$畻鍒幫紝浼氫負0
涓嶈繃鍙杦in(mask ^ (1<<vt[i]-2))灝辮鍚?br /> */
vector<int> ans;
for (int i = 0; i < vt.size(); i++) {
if (!win(mask^(1<<vt[i]-2), forbiden, multiple, vt[i])) {
ans.push_back(vt[i]);
}
}
if(ans.empty()) {
puts("There is no winning move.");
} else {
printf("The winning moves are:");
sort(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); i++) {
printf(" %d", ans[i]);
}
puts(".");
}
puts("");
}
return 0;
}
]]>
]]>
]]>
緇欏嚭涓や釜涓睞,B <=2000錛屾瀯閫犱竴涓柊涓詫紝浣垮緱璇ユ柊涓茬殑瀛愬簭鍒楁槸A,B錛屼笖闀垮害鏈鐭?br />
姹傛柊涓茬殑鏂規鏁?br />
鏄劇劧鏄渶灝忛暱搴+m-lcs
姣旇禌鏃訛紝鎴戦敊璇仛娉曟槸瀵圭浉閭誨尮閰嶇偣涓棿鐨勫瓧絎﹁繘琛屾帓鍒楋紝濡?br />
abcd
aefd
灝卞浐瀹歛,d錛屼腑闂寸殑b,c,e,f鎺掑垪錛屽綋鐒墮渶瑕乥鍦╟鍓嶏紝e鍦╢鍓?br />
浣嗚繖縐嶅仛娉曢亣鍒板涓尮閰嶇偣鏃跺氨鏈夐棶棰樹簡錛屽
be
babo
涓婇潰鐨刡鍙互璺熶笅闈袱涓尮閰嶏紝鐩存帴鍍忎笂闈㈤偅鏍峰瓙鎺掑垪浼氭湁閲嶅鐨勯棶棰?br />
褰撴椂灞闄愬湪涓婇潰鐨勬濊礬錛屾病鎼炲嚭.
鍏跺疄涓嶉毦錛岀洿鎺p鍗沖彲
dp[i,j]琛ㄧず浠[i]鎴栬匓[j]緇撳熬鐨勪覆鐨勪釜鏁?br />
濡傛灉A[i] = B[j]錛屽垯dp[i,j] = dp[i-1,j-1] 鍥犱負榪欐椂蹇呴』鍖歸厤A[i],B[j]
鍚﹀垯錛宭cs[i-1,j] > lcs[i,j-1] 鍒檇p[i,j] = dp[i-1,j] 榪欐椂鏂頒覆鑲畾鏄疉[i]緇撳熬錛屽洜涓哄彇鐨勬槸dp[i-1,j]
lcs[i-1,j] < lcs[i,j-1] 鍒檇p[i,j] = dp[i,j-1] 榪欐椂鏂頒覆鑲畾鏄疊[i-1]緇撳熬
lcs[i-1,j] = lcs[i,j-1] 鍒檇p[i,j] = dp[i-1,j] +dp[i,j-1] 榪欐椂鏂頒覆鍙互鏄疉[i]鎴朆[j]緇撳熬錛屼絾涓嶄細閲嶅錛屽洜涓哄熬閮ㄤ笉鍚?br />
鍧戝緱錛屽綋鏃舵瘮璧涙椂錛屾病鎯蟲墦濡傛灉鍙杁p[i-1,j]錛岃嚜鐒舵槸浠[i]緇撳熬鐨勶紒錛侊紒
緇撳熬涓嶅悓錛屼笉浼氬鑷撮噸澶嶈鏁扮殑錛侊紒
鐢ㄧ粍鍚堟暟瀛︾殑鏂規硶綆楁椂錛屼笉娓呮灝鵑儴鏄粈涔?img src="http://www.shnenglu.com/Images/dot.gif" alt="" />
*/
#include<cstdio>
#include<iostream>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#include<set>
#include<cstring>
#include<string>
#include<stack>
#include<cassert>
#include<sstream>
#include<list>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 2010;
const int MOD = 1000000007;
int dp[MAXN][MAXN], lcs[MAXN][MAXN];
char A[MAXN], B[MAXN];
int main()
{
//freopen("in","r", stdin);
//freopen("out","w", stdout);
while (~scanf("%s%s", A+1, B+1)) {
int n = strlen(A+1);
int m = strlen(B+1);
memset(dp, 0, sizeof dp);
memset(lcs, 0, sizeof lcs);
for (int i = 0; i <= n; i++) {
dp[i][0] = 1;
}
for (int i = 0; i <= m; i++) {
dp[0][i] = 1;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m;j ++) {
if (A[i] == B[j]) {
lcs[i][j] = lcs[i-1][j-1]+1;
dp[i][j] = dp[i-1][j-1];
} else if (lcs[i-1][j] > lcs[i][j-1]) {
lcs[i][j] = lcs[i-1][j];
dp[i][j] = dp[i-1][j];
} else if (lcs[i-1][j] < lcs[i][j-1]) {
lcs[i][j] = lcs[i][j-1];
dp[i][j] = dp[i][j-1];
} else {
lcs[i][j] = lcs[i-1][j];
dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % MOD;
}
}
//cout<<lcs[n][m]<<endl;
cout<<dp[n][m]<<endl;
}
return 0;
}
]]>
n涓暟錛屾眰鏈闀跨殑榪炵畫涓孌碉紝浣垮緱榪欎竴孌墊暟瀛楋紝浜岃繘鍒朵腑姣忎竴浣嶆嫢鏈?鐨勯偅浜涙暟瀛楃殑涓暟鐩哥瓑
n<=10^5錛屼綅鏁発<=30
濡?br />
7 2 1 4 榪欓噷姣忎竴浣?閮芥湁2涓暟瀛楁嫢鏈?br />
瀹規槗鎯沖埌鍏堥澶勭悊鍑簊um[n,k]琛ㄧず鍓嶉潰n涓暟瀛椾腑鍦ㄧk浣嶆槸1鐨勪釜鏁?br />
榪檏涓暟瀛梥um[n,k]鐨勬牱瀛愬氨鏄洸綰垮艦鐨勶紝濡俿um[i,k]涓?nbsp;
_ /\
/ \/ \_/\
涓轟簡浣垮緱sum[i,k] - sum[j,k]瀵規墍鏈塳閮芥槸鍚屼竴涓暟
鍒檚um[j,k]鐨勬牱瀛愪篃蹇呴』鏄繖鏍風殑錛岃繖鏍穝um[i,k] - sum[j,k]鎵嶆槸涓涓悓涓涓暟錛堢被浼兼嫾鎺ユ椂鍥懼艦闇鍚誨悎錛?br />
濂戒簡錛屾墍浠ユ垜浠渶瑕佷繚瀛樿繖涓浘褰紝鍙互閫氳繃淇濆瓨a[i,k] = sum[i,k] - sum[i,0]鍗沖彲錛堝嵆淇濆瓨鐩稿鍊鹼級 -----OMG
鎴戜竴寮濮嬬敤map<vector<int>, int>錛?nbsp;vector<int>鏄繚瀛樺浘褰紝int鏄繚瀛樼涓嬈″嚭鐜扮殑鍦版柟
鍦╢or鍒癷鏃訛紝璁$畻鍑哄浘褰紝鍦╩ap涓壘鏈夋病鍑虹幇榪囷紝鏈夌殑璇濆氨鏇存柊絳旀涓篿-mp[vt]
vector鏄湁閲嶈澆姣旇緝榪愮畻絎︾殑錛屾墍浠ヤ笉鐢ㄥ啓鍏朵粬
浣嗘槸瓚呮椂浜嗭紝鎴戝湪鏈満嫻嬭矊浼間笉浼氳秴鏃?img src="http://www.shnenglu.com/Images/dot.gif" alt="" /> --||
鐪嬩簡瑙i鎶ュ憡錛屾柟娉曚竴鏍鳳紝浣嗘槸涓嶆槸鐢╩ap錛屾槸鏈鍚巗ort涓嬈$殑
瀵瑰摝錛屾垜鎯寵搗涔嬪墠涔熸湁涓閬撻錛屽張涓嶉渶瑕佹瘡涓猧閮借緭鍑虹粨鏋滐紝涓嶇敤map錛岀洿鎺ユ渶鍚巗ort涓嬈℃洿濂?br />
鐢╩ap浼氭參涓鐐?br />
浣嗚繖鏍瘋繕瓚呮椂錛屽師鏉ユ槸vector鐨勬瘮杈冩瘮杈冩參
鑷繁鍐欎簡涓猻truct Node {int vt[30];}; 鍐嶉噸杞芥瘮杈冭繃浜?br />
sort鏃訛紝鍙互瀵逛笅鏍囨帓搴忥紝鍑忓皯浜嗗ぇ鏁版嵁縐誨姩
榪欓瀹樻柟鏈夊彟澶栬В娉曪紝灝辨槸瀵規暟緇剉t[30] hash
濂界殑hash鍑芥暟浼氬揩寰堝鍚?br />
hsize=997001;
for(p=0,i=0;i<k;i++)
p=((p<<2)+(v[i]>>4))^(v[i]<<10);
p=p%hsize;
if(p<0) p+=hsize;
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
const int MAXN = 100100;
int n, k;
struct Node
{
int vt[30];
void clear()
{
memset(vt, 0, sizeof vt);
}
};
bool operator < (const Node &A, const Node &B) //鐩存帴鐢╲ector鐨勬瘮杈冧細鎱?img src="http://www.shnenglu.com/Images/dot.gif" alt="" /> 鍙兘鏁版嵁澶ぇ鍚?/span>
{
for (int i = 0; i < k - 1; i++) {
if (A.vt[i] != B.vt[i]) {
return A.vt[i] < B.vt[i];
}
}
return false;
}
pair<Node, int> all[MAXN];
inline bool cmp(const int &a, const int &b)
{
return all[a] < all[b];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
for (; ~scanf("%d%d", &n, &k); ) {
// long long start = clock();
vector<int> vt(k-1), pos(n+1);
all[0].first.clear();//don't forget to push k-1 zeros
all[0].second = 0;
pos[0] = 0;
vector<int> sum(k);
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
for (int j = 0; j < k; j++) {
sum[j] += (x>>j) & 1;
if (j > 0) {
all[i].first.vt[j-1] = sum[j] - sum[j-1];
}
}
all[i].second = i;
pos[i] = i;
}
sort(pos.begin(), pos.end(), cmp);
int ans = 0;
for (int i = 1, last = 0; i <= n+1; i++) {
if (i == n+1 || all[pos[i-1]].first < all[pos[i]].first) {
ans = max(ans, all[pos[i-1]].second - all[pos[last]].second);
last = i;
}
}
printf("%d\n", ans);
// cout<<"time "<<clock() - start<<endl;
}
return 0;
}
]]>