C. Pattern【1200】

Problem - 412C - Codeforces

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Developers often face with regular expression patterns. A pattern is usually defined as a string consisting of characters and metacharacters that sets the rules for your search. These patterns are most often used to check whether a particular string meets the certain rules.

In this task, a pattern will be a string consisting of small English letters and question marks ('?'). The question mark in the pattern is a metacharacter that denotes an arbitrary small letter of the English alphabet. We will assume that a string matches the pattern if we can transform the string into the pattern by replacing the question marks by the appropriate characters. For example, string aba matches patterns: ???, ??a, a?a, aba.

Programmers that work for the R1 company love puzzling each other (and themselves) with riddles. One of them is as follows: you are given n patterns of the same length, you need to find a pattern that contains as few question marks as possible, and intersects with each of the given patterns. Two patterns intersect if there is a string that matches both the first and the second pattern. Can you solve this riddle?

Input

The first line contains a single integer n (1 ≤ n ≤ 105) — the number of patterns. Next n lines contain the patterns.

It is guaranteed that the patterns can only consist of small English letters and symbols '?'. All patterns are non-empty and have the same length. The total length of all the patterns does not exceed 105 characters.

Output

In a single line print the answer to the problem — the pattern with the minimal number of signs '?', which intersects with each of the given ones. If there are several answers, print any of them.

Examples

input

Copy

2
?ab
??b

output

Copy

xab

input

Copy

2
a
b

output

Copy

?

input

Copy

1
?a?b

output

Copy

cacb

Note

Consider the first example. Pattern xab intersects with each of the given patterns. Pattern ??? also intersects with each of the given patterns, but it contains more question signs, hence it is not an optimal answer. Clearly, xab is the optimal answer, because it doesn't contain any question sign. There are a lot of other optimal answers, for example: aab, bab, cab, dab and so on.

题意翻译

给你nn个长度相等的字符串,由小写字母和问号(问号视为任意一个小写字母)组成。你需要输出一个与之长度相等的字符串,使得当这个字符串的第ii位为某个字母时,nn个字符串的第ii位均为这个字母。

如果某一位不符合规定,你需要输出?,(当然如果某一位符合规定也可以输出?)但是问号数目要尽量小。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<deque>
#include<cmath>
#include<string.h>
using namespace std;
// ctrl+shift+C 注释
//ctrl+shift+x 取消
#define int long long
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef pair<int,int> PII;
const int N=2e5+10;
const ll M=1e18+10;
const int mod=1e9+7;
int a[N],sum[N];
priority_queue<int,vector<int>,greater<int> >pq;
set<int>se;
map<int,int>mp;
queue<int>qu;
vector<int>v;
deque<int>de;
string s,ss;
void solve()
{
    int n;
  cin>>n;
  int flag=0;
  for(int i=0;i<n;i++)
  {
      cin>>s;
      if(i==0)
      {
          ss=s;
          continue;
      }
      for(int i=0;s[i];i++)
      {
          if(ss[i]=='?'&&s[i]=='?')
          {
              ss[i]==s[i];
          }
          else if(ss[i]!='?'&&s[i]=='?')
          {
              ss[i]==ss[i];
          }
          else if(s[i]!='?'&&ss[i]!='?')
          {
              if(s[i]!=ss[i]&&ss[i]!='^')
              {
                  ss[i]='^';//都不相同
                  flag++;
              }
          }
          else if(s[i]!='?'&&ss[i]=='?')
          {
              ss[i]=s[i];
          }

      }
  }
  if(!flag)
  {
      for(int i=0;ss[i];i++)
     {
      if(ss[i]=='?')
      {
          ss[i]='z';
      }
     }
    cout<<ss<<endl;
  }
  else
  {
          for(int i=0;ss[i];i++)
          {
              if(ss[i]=='?')
              {
                  ss[i]='z';
              }
              if(ss[i]=='^')
                ss[i]='?';
          }
          cout<<ss<<endl;
  }
}
signed main()
{
   int t=1;
   //cin>>t;
   while(t--)
   {
       solve();
   }
}

emmm。写得略微粗糙了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值