1. 程式人生 > >HDU 4915 Parenthese Sequence 思維+模擬

HDU 4915 Parenthese Sequence 思維+模擬

sca str class logs 說明 也有 seq code space

題意:給出括號序列s,其中有‘?‘表示可以為‘(‘或‘)‘.
|s|<=1e6,問將這些‘?‘代替後,s是否合法,若合法 是否有多解?

首先:把已經匹配的丟出去,不影響序列的合法性
則 維護前綴i ‘(‘最多和最少未匹配的個數,對後綴i維護‘)‘最多和最少未匹配的個數 (還剩個數)
當max[i]<0 說明某個‘(‘或‘)‘不夠匹配為無解.
假如後綴i最少有x個‘)‘,則前綴i-1最少要有x個‘(‘ 後綴i最多有y個‘)‘ 前綴i-1‘(‘個數不多於y
則前面左括號的範圍就為[x,y]若y-x+1>=2,則前綴i-1左括號有多種選擇,後面右括號對應也有多種選擇,則有多解

#include <bits/stdc++.h>
using
namespace std; typedef long long ll; typedef pair<ll,ll> ii; const int N=2e6+20; const ll mod=1e9+7; char s[N]; int f[N],g[N],a[N],b[N]; int main() { while(scanf("%s",s+1)!=EOF) { int n=strlen(s+1); if(n%2) { puts("None"); continue; }
bool flag=true,mk=false; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(f,0,sizeof(f));//×?éù memset(g,0,sizeof(g)); for(int i=1;s[i];i++) { f[i]+=f[i-1]; g[i]+=g[i-1]; if(s[i]==() f[i]++,g[i]++;
if(s[i]==)) f[i]--,g[i]--; if(s[i]==?) f[i]--,g[i]++; if(f[i]<0) f[i]=1;//‘?‘2??ü±? if(g[i]<0) flag=false; } for(int i=n;i>=1;i--) { a[i]+=a[i+1],b[i]+=b[i+1]; if(s[i]==() a[i]--,b[i]--; if(s[i]==)) a[i]++,b[i]++; if(s[i]==?) a[i]--,b[i]++; if(a[i]<0) a[i]+=2; if(b[i]<0) flag=false; if(min(b[i],g[i-1])-max(a[i],f[i-1])+1>=2) mk=true; } if(flag==false) puts("None"); else { if(mk) puts("Many"); else puts("Unique"); } } return 0; }

HDU 4915 Parenthese Sequence 思維+模擬