1. 程式人生 > >Codeforces Round #445 div.2 D. Restoration of string 亂搞

Codeforces Round #445 div.2 D. Restoration of string 亂搞

als com bool ack round tin res 暴力 c++

D. Restoration of string

題意:給你n個字符串,讓你構造一個終串,使得這n個字符串都是終串的最小頻繁子串,如果不存在輸出NO。 最頻繁子串:出現次數最多的子串

tags: 直接暴力懟??

#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 = 200005; int n, in[28]; char s[N]; bool vis[28], used[28]; vector< int > G[N]; void print(int x) { putchar(a
+x); vis[x] = true; if(G[x].size()==1) print(G[x][0]); } bool check(int x) { if(vis[x]) return false; vis[x]=true; if(G[x].size()==1) return check(G[x][0]); return true; } int main() { scanf("%d", &n); rep(i,1,n) { scanf(
"%*c%s", s+1); mes(vis, false); for(int j=1; s[j]; ++j) { int id = s[j]-a; if(vis[id]) return 0*printf("NO\n"); vis[id]=true, used[id]=true; if(j>1) { if(G[s[j-1]-a].size()==1 && G[s[j-1]-a][0]==s[j]-a) continue; G[s[j-1]-a].PB(s[j]-a); ++in[s[j]-a]; } if(G[s[j-1]-a].size()>1 || in[s[j]-a]>1) return 0*printf("NO\n"); } } mes(vis, false); rep(i,0,25) if(used[i]) { mes(vis, false); if(!check(i)) return 0*printf("NO\n"); } mes(vis, false); rep(i,0,25) if(used[i] && !vis[i] && in[i]==0) print(i); puts(""); return 0; }

Codeforces Round #445 div.2 D. Restoration of string 亂搞