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");
    
} 
 

 

posted @ 2021-02-06 12:46  zlc0405  阅读(72)  评论(0编辑  收藏  举报