zoukankan      html  css  js  c++  java
  • hihoCoder-1829 2018亚洲区预选赛北京赛站网络赛 B.Tomb Raider 暴力 字符串

    题面

    题意:给你n个串,每个串都可以选择它的一个长度为n的环形子串(比如abcdf的就有abcdf,bcdfa,cdfab,dfabc,fabcd),求这个n个串的这些子串的最长公共子序列(每个串按顺序提出来字符,而这些字符并不一定要相邻)是什么(输出字典序最小的那个),没有就输出0

    题解:看起来很难做,但实际上是10个串,每个串长度为8,也就是对于每个串也只有8个环形n子串,于是我们直接暴力枚举第一串的8种,与第二个串的8个依次求LCS

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 char a[15][30],pat[30],ans_string[30];
     4 int len[30],ans,n;
     5 void solve(int length)
     6 {
     7     int start,limit,pat_len;
     8     int ok=1,flag=0;
     9     for (int i=1;i<n;i++)
    10     {
    11         pat_len=0;
    12         flag=0;
    13         for (int j=0;j<len[i];j++)
    14             if (a[i][j]==pat[0])
    15             {
    16                 start=j+1;
    17                 limit=j+len[i];
    18                 pat_len=1;
    19                 while (start<limit && pat_len<length)
    20                 {
    21                     if (a[i][start]==pat[pat_len]) pat_len++;
    22                     start++;
    23                 }
    24                 if (pat_len==length)
    25                 {
    26                     flag=1;
    27                     break;
    28                 }
    29             }
    30         if (!flag)
    31         {
    32             ok=0;
    33             break;
    34         }
    35     }
    36     if (ok)
    37     {
    38         if (length > ans || ((ans==length) && (strcmp(pat,ans_string)<0) ))
    39         {
    40             ans=length;
    41             for (int i=0;i<ans;i++) ans_string[i] = pat[i];
    42             ans_string[ans] = '';
    43         }
    44     }
    45 }
    46 void dfs(int k,int last,int limit)
    47 {
    48     solve(k);
    49     for (int i=last+1;i<limit;i++)
    50     {
    51         pat[k]=a[0][i];
    52         pat[k+1]='';
    53         dfs(k+1,i,limit);
    54     }
    55     return;
    56 }
    57 int main() 
    58 {
    59     while (scanf("%d",&n)!=EOF)
    60     {
    61         ans=0;
    62         for (int i=0;i<n;i++) 
    63         {
    64             scanf("%s",a[i]);
    65             len[i]=strlen(a[i]);
    66         }
    67         for (int j=0;j<n;j++) 
    68         {
    69             for (int i=0;i<len[j];i++) a[j][i+len[j]]=a[j][i];    
    70             a[j][len[j]*2]='';
    71         }
    72         for (int i=0;i<len[0];i++) 
    73         {
    74             pat[0]=a[0][i];
    75             pat[1]='';
    76             dfs(1,i,i+len[0]);
    77         }
    78         if (ans>0) printf("%s
    ", ans_string); else printf("0
    ");
    79     }
    80 }
    Anderyi!
  • 相关阅读:
    [翻译] 为什么Uber的数据库从Postgres 切换到 MySql
    Salesforce.com Object Query Language (SOQL) 示例
    SalesForce 入门
    jeasyui datagrid 使用记
    2- 计算机的组成以及VMware使用
    1.计算机三大操作系统介绍
    01- Java概述
    01- Sublime的工具安装以及使用
    01- web测试快速入门
    02- Java搭建环境搭建
  • 原文地址:https://www.cnblogs.com/qywhy/p/9694462.html
Copyright © 2011-2022 走看看