标签:
#include <iostream> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <stack> #include <map> #include <set> #include <string> #include <vector> #include <queue> #include <ctime> #define cl(A) memset(A, 0, sizeof(A)) #define lowbit(x) (x & -x) using namespace std; typedef long long LL; const int mod=1e9+7; const int maxn=2e5+10; const int inf=0x3f3f3f3f; struct node { char s[25][15]; int k; } st[15]; int num[10]; char l[10][15]; int main() { #ifdef local freopen("in", "r", stdin); #endif int n,m; cin>>n; for(int i = 0; i < n ; i++) { scanf("%s",l[i]); num[i]=i; } cin>>m; for(int i=0; i<m; i++) { scanf("%d",&st[i].k); for(int j=0; j<st[i].k; j++) scanf("%s",st[i].s[j]); } int p=20,ans=inf; do { int nixu=0; for(int i=0; i<n; i++) { for(int j=0; j<i; j++) { if(num[j]>num[i])nixu++; } } if(nixu>ans)continue; for(int i=0; i<m; i++) { int pi=0; for(int j=0; j<st[i].k&&pi<n; j++) { if(strcmp(l[num[pi]],st[i].s[j])==0)pi++; } if(pi==n&&(nixu<ans||(ans==nixu&&p>i))) { p=i; ans=nixu; } } } while(next_permutation(num,num+n)); if(ans==inf) { puts("Brand new problem!"); } else { printf("%d\n",p+1); printf("[:"); for(int i=0; i<n*(n-1)/2+1-ans; i++)putchar(‘|‘); puts(":]"); } }
发现以前做不出真是有点脑残。。这么水的并查集。题意问给你一串长度为n的字符串,里面有可能包含‘?‘还有小写字母,还有m个操作,每个有a,b表示这两个位置的字符相同,然后问你有几种方案使得这个字符串变成回文串。边判边并起来就行了。最后答案就是26^cnt.
#include <iostream> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <stack> #include <map> #include <set> #include <string> #include <vector> #include <queue> #include <ctime> #define cl(A) memset(A, 0, sizeof(A)) #define lowbit(x) (x & -x) using namespace std; typedef long long LL; const int mod=1e9+7; const int maxn=2e5+10; const int inf=0x3f3f3f3f; int fa[500005]; char s[500005]; void init(int n){ for(int i=0;i<=n;i++) fa[i]=i; } int finds(int x){ if(fa[x]==x)return x; return fa[x]=finds(fa[x]); } void uf(int a,int b){ if(a==b)return; if(s[a]!=‘?‘) fa[b]=a; else fa[a]=b; } int main() { #ifdef local freopen("in", "r", stdin); #endif int T; scanf("%d",&T); while(T--){ bool flag=1; int n,m; scanf("%d%d",&n,&m); init(n); scanf("%s",s); for(int i=0;i<n;i++){ if(s[i]!=‘?‘&&s[n-i-1]!=‘?‘&&s[i]!=s[n-i-1])flag=0; else if(s[i]==‘?‘)s[i]=s[n-i-1]; else s[n-i-1]=s[i]; } for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); --a,--b; a=finds(a); b=finds(b); if(s[a]!=‘?‘&&s[b]!=‘?‘&&s[a]!=s[b])flag=0; if(flag)uf(a,b); } for(int i=0,j=n-1;i<n/2;i++,j--){ int a,b; a=finds(i); b=finds(j); if(s[a]!=‘?‘&&s[b]!=‘?‘&&s[a]!=s[b])flag=0; if(flag)uf(a,b); } if(!flag)cout<<0<<endl; else { int cnt=0; for(int i=0;i<n;i++){ int h=finds(i); if(s[h]==‘?‘&&fa[i]==i){ cnt++; } } LL ans=1; for(int i=0;i<cnt;i++)ans=(26*ans)%mod; cout<<ans<<endl; } } }
标签:
原文地址:http://www.cnblogs.com/scau-zk/p/5785530.html