NOIP2013模擬 歸途與征程

2021-07-12 05:17:43 字數 1278 閱讀 9844

給出兩個字串,a和b,|a|=n,|b|=m,並且a中有許多*——萬用字元。這個東西可以匹配任意的字串,包括空串。現在問你,b的迴圈同構的字串中,有多少個可以和a匹配?

n<=100,m<=10^5

什麼東東?

還以為是擴k呢。。。

實際上只是乙個暴力。

我們把a串分成一段一段的,然後列舉起點,暴力往後跑,用kmp判斷第乙個能匹配某段的位置,然後就能拿到80分。

再然後,100分演算法只需要用乙個類似於字首和的東西,處理處每個位值後面第乙個能個某個串匹配的位置在**,然後每次跑的複雜度就降到o(n)了。

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

#define n 100005

#define m 105

using namespace std;

char s[n],str[n*2],p[m][m],pre[m],suf[m];

int n,m,st,en,s,next[m][m],suc[n*2][m],len[m],ans,lenp,lens,cnt;

bool bz[m][n*2];

int main()

pre[++lenp]=s[i];

}fd(i,n,1)

suf[++lens]=s[i];

}fo(i,1,lens/2) swap(suf[i],suf[lens-i+1]);cnt=1;

fo(i,st,en)

p[cnt][++len[cnt]]=s[i];

}fo(i,1,cnt)

}fo(i,1,cnt)

}fd(i,m*2-1,1)

fo(i,1,m)

k++;

}if (!pd) continue;

if (k==i+m)

s=k;k=i+m-1;

fd(j,lens,1)

k--;

}if (!pd) continue;int tot=1;

while (tot<=cnt)

s=suc[s][tot]+len[tot++];

}if (!pd) continue;

if (tot>cnt&&s-1<=k) ans++;

}printf("%d",ans);

}

模擬 NOIP 2013 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOI(P)2013模擬 秘密任務

這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...

NOIP2013模擬 粉刷匠

給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...