码迷,mamicode.com
首页 > 其他好文 > 详细

补题0%……计划进行中

时间:2016-08-18 23:02:57      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:

MDZZ题目长死了,题意大概是给你一个句子,把它全排序,然后下面给你要你匹配的句子,问你,排序后逆序数最少,并且能匹配成功的那个编号,如果逆序数一样的话,就输出最小的那个编号,然后后面输出的东西就是照着题意给的那个式子。
技术分享
#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(":]");
    }
}
View Code

Gym 100676F

发现以前做不出真是有点脑残。。这么水的并查集。题意问给你一串长度为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;
        }
    }
}
View Code

 

补题0%……计划进行中

标签:

原文地址:http://www.cnblogs.com/scau-zk/p/5785530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!