給出兩個字串,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個不合法的空的方案數。這裡的空指...