Nowcoder9983F.匹配串(思维)
链接:https://ac.nowcoder.com/acm/contest/9983/F
来源:牛客网
一个模式串指仅包含小写英文字母和至少一个'#'的字符串,其中'#'可以匹配一段任意长度的任意小写字母字符串。
一个匹配串指待匹配的只包含小写字母的字符串。
一个模式串和一个匹配串相匹配当且仅当把模式串里面的'#'全部分别替换成空或一段小写字母字符串后,两个串完全相同。
现在给出n\mathit nn个模式串,问有多少不同的匹配串与这些模式串全部相匹配。
如果答案有无穷多个,输出-1\text -1-1。
只可能输出0或-1
//每个字符串被#分割成若干个字符串 //如果是#..#..#,那么第一个 #include<bits/stdc++.h> using namespace std; const int maxn=1e6+100; string s[maxn]; string f1,f2; int main () { int f=1; int n; scanf("%d",&n); for (int i=1;i<=n;i++) cin>>s[i]; for (int i=1;i<=n;i++) { int j; for (j=0;j<s[i].size();j++) if (s[i][j]=='#') break; string t1=s[i].substr(0,j); //st1.insert(s.substr(0,j)); for (j=s[i].size()-1;j>=0;j--) if (s[i][j]=='#') break; //st2.insert(s.substr(j+1,s[i].size()-j-1)); string t2=""; if (j!=s[i].size()-1) t2=s[i].substr(j+1,s[i].size()-j-1); //cout<<t1<<" "<<t2<<'\n'; for (int j=0;j<min(t1.size(),f1.size());j++) if (t1[j]!=f1[j]) { f=0; break; } for (int j=0;j<min(t2.size(),f2.size());j++) if (t2[t2.size()-1-j]!=f2[f2.size()-1-j]) { f=0; break; } if (!f) break; if (t1.size()>f1.size()) f1=t1; if (t2.size()>f2.size()) f2=t2; } if (f) printf("-1\n"); else printf("0\n"); }