[CQOI2014]通配符匹配
生活随笔
收集整理的這篇文章主要介紹了
[CQOI2014]通配符匹配
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
https://www.zybuluo.com/ysner/note/1311407
題面
幾乎所有操作系統(tǒng)的命令行界面\((CLI)\)中都支持文件名的通配符匹配以方便用戶。
最常見的通配符有兩個,一個是星號,可以匹配\(0\)個及以上的任意字符;
另一個是問號,可以匹配恰好一個任意字符。
現(xiàn)在需要你編寫一個程序,對于給定的文件名列表和一個包含通配符的字符串,判斷哪些文件可以被匹配。
- \(n\leq100,|S|\leq10^5\)
通配符個數(shù)\(\leq10\)
解析
由于一些不可言妙的錯誤,我調(diào)這破題的時間跨度長達4h
狀態(tài)顯然是\(f[i][j]\)表示上面的串匹配到第\(i\)位,下面的串匹配到第\(j\)位。
然后注意到上面那串中最值得商榷的是一個通配符匹配哪些字符。
所以可以把上面的串簡化為通配符形式,通配符之間的部分用哈希與下面匹配就行。
這樣復雜度就對了,\(O(n*10|S|)\)。
然后討論下轉(zhuǎn)移就行。
SOS:誰能幫我查下這份代碼問題出在哪里。。。(用來交[AHOI2005]病毒檢測)
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<vector> #define ll unsigned long long #define re register #define il inline #define fp(i,a,b) for(re int i=a;i<=b;++i) #define fq(i,a,b) for(re int i=a;i>=b;--i) using namespace std; const int N=1005; int n,m,tot,f[N][N],sta[N],top,jc[N],ans; ll ht[N],hs[N]; char T[N],S[N]; il int gi() {re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t; } int main() {scanf("%s",T+1);n=strlen(T+1)+1;T[n]='?';jc[0]=1;fp(i,1,1000) jc[i]=jc[i-1]*2333;fp(i,1,n){ht[i]=ht[i-1]*2333+T[i];if(T[i]=='*'||T[i]=='?') sta[++top]=i;}tot=gi();while(tot--){scanf("%s",S+1);m=strlen(S+1)+1;S[m]='#';fp(i,1,m) hs[i]=hs[i-1]*2333+S[i];memset(f,0,sizeof(f));f[0][0]=1;fp(i,1,top){re int l=sta[i-1]+1,r=sta[i]-1;fp(j,r-l+1,m){if(ht[r]-ht[l-1]*jc[r-l+1]==hs[j]-hs[j-(r-l+1)]*jc[r-l+1])f[i][j+(T[sta[i]]=='?')]|=f[i-1][j-(r-l+1)];}if(T[sta[i]]=='*') fp(j,1,m) f[i][j]|=f[i][j-1];}ans+=1-f[top][m];}printf("%d\n",ans);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/yanshannan/p/9795666.html
總結(jié)
以上是生活随笔為你收集整理的[CQOI2014]通配符匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1. 冒泡与选择排序及其比较
- 下一篇: Yii 2.0 GII 访问404错误