2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
C
好久前做的,忘记了,,, 好像是个图论瞎搞题。。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 1000005; char s[N], vow[10] = { 'a', 'e', 'i', 'o', 'u', 'w', 'y' }; int len, con[21], num[28][28]; vector< int > G[28]; bool vis[28], vis1[28]; bool is(char x) { rep(i,0,6) if(x==vow[i]) return false; return true; } int dfs(int u) { vis1[u] = true; int ans = 0; for(auto to : G[u]) { if(vis[u] ^ vis[to] == 1) ans += num[u][to]; if(!vis1[to]) ans += dfs(to); } return ans; } int main() { freopen("consonant.in","r",stdin); freopen("consonant.out","w",stdout); scanf("%s", s+1); len = strlen(s+1); rep(i,1,len-1) { if(is(s[i]) && is(s[i+1])) { int ch1=s[i]-'a', ch2=s[i+1]-'a'; if(num[ch1][ch2]==0) G[ch1].PB(ch2); if(num[ch2][ch1]==0) G[ch2].PB(ch1); ++num[ch1][ch2]; ++num[ch2][ch1]; } } int cnt = 0; rep(i,0,25) if(is('a'+i)) con[cnt++] = i; int ans = 0, mx = -1; rep(i,0,(1<<19)-1) { mes(vis, false); rep(j,0,18) { if((i>>j)&1) vis[con[j]]=true; } mes(vis1, false); int ans1 = 0; rep(j,0,18) { int ch = con[j]; if(!vis1[ch]) ans1 += dfs(ch)/2; } if(ans < ans1) ans=ans1, mx=i; } mes(vis, false); if(mx != -1) { rep(j,0,18) { if((mx>>j)&1) vis[con[j]]=true; } } rep(i,1,len) putchar(vis[s[i]-'a'] ? (s[i]-32) : s[i]); puts(""); return 0; }