hdu 6170 正則表示式
阿新 • • 發佈:2018-12-01
題意:給你一個正則表示式(偽),唯一不同其中.*代表 不是 *個. 而是.先匹配再星
思路:場上dp過了(瞎分類討論不知道wa了多少次。。),試圖用正則來著但是不會寫。。。下來學習一下姿勢。。
首先regex這個c++11的庫函式就不多說了,知道怎麼構造正則和匹配就可以了。重要的還是正則姿勢。
實際上正解的就是把 .* 換成(.)\1*,
匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字元。 |
PS.姿勢水平還要提升一個。附上正則的連結 正則表示式(百度百科)
PPS.跑的賊慢。。。大概做題是用不上了。。。
程式碼:
#include<bits/stdc++.h> using namespace std; #define X first #define Y second #define PB push_back #define MP make_pair #define MEM(x,y) memset(x,y,sizeof(x)); #define bug(x) cout<<"bug"<<x<<endl; typedef long long ll; const int maxn =5e5+100; typedef pair<int,int> pii; string s1,s2; int main(){ int t; std::ios::sync_with_stdio(false); cin>>t; string abc; abc="(.)\\1*"; while(t--){ cin>>s1>>s2; string tmp; int n=s2.size(); for(int i=0;i<n;i++){ if(s2[i-1]=='.'&&s2[i]=='*') continue; if(i+1<n&&s2[i]=='.'&&s2[i+1]=='*') tmp+=abc; else tmp+=s2[i]; } regex R(tmp); if(regex_match(s1,R)) cout<<"yes\n"; else cout<<"no\n"; } return 0; }
匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字元。 |