Advertisement
Alisator

PAL5_OOP

Dec 1st, 2014
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.95 KB | None | 0 0
  1. package pal;
  2.  
  3. import java.util.*;
  4. import java.math.*;
  5. import java.io.*;
  6.  
  7. public class Main
  8. {
  9.     public static void main(String[] args) throws IOException {
  10.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  11.         String[] configuration = br.readLine().split(" ");
  12.         String alphabet = configuration[0];
  13.         int membersCount = Integer.parseInt(configuration[1]);
  14.         int acceptThreshold = Integer.parseInt(configuration[2]);
  15.         int proposalLength = Integer.parseInt(configuration[3]);
  16.        
  17.         Member[] committeeMembers = new Member[membersCount];
  18.         for (int i = 0; i < membersCount; i++) {
  19.             committeeMembers[i] = parseMember(br);
  20.         }
  21.        
  22.         Committee committee = new Committee(acceptThreshold, alphabet, committeeMembers);
  23.         BigInteger result = committee.validateAllProposals(proposalLength);
  24.        
  25.         System.out.println(result.mod(BigInteger.valueOf(100000)));
  26.     }
  27.    
  28.     private static Member parseMember(BufferedReader br) throws IOException {
  29.         int evaluationCount = Integer.parseInt(br.readLine());
  30.         String[] evaluationCriteria = new String[evaluationCount];
  31.         for (int i = 0; i < evaluationCount; i++) {
  32.             evaluationCriteria[i] = br.readLine();
  33.         }
  34.         return new Member(evaluationCriteria);
  35.     }
  36.    
  37.     /***************************************************************************
  38.      *
  39.      */
  40.     public static class Committee
  41.     {
  42.         private final List<Member> memberList;
  43.         private final List<String> alphabetList;
  44.         private final BigInteger alphabetSize;
  45.         private final int acceptThreshold;
  46.         private final int rejectThreshold;
  47.  
  48.         public Committee(int acceptThreshold, String alphabet, Member... members) {
  49.             this.acceptThreshold = acceptThreshold;
  50.             this.rejectThreshold = members.length - acceptThreshold + 1;
  51.             this.alphabetList = new LinkedList<>();
  52.             this.alphabetSize = BigInteger.valueOf(alphabet.length());
  53.             for (char c : alphabet.toCharArray())
  54.                 alphabetList.add(Character.toString(c));
  55.             this.memberList = Arrays.asList(members);
  56.         }
  57.  
  58.         public BigInteger validateAllProposals(int maxLen) {
  59.             List<String> carryProposal = new LinkedList<>();
  60.             carryProposal.add("");
  61.             return validateAllProposals(1, maxLen, BigInteger.ZERO, carryProposal);
  62.         }
  63.  
  64.         private BigInteger validateAllProposals(int curLen, int maxLen, BigInteger carryResult, List<String> carryProposal) {
  65.             if (curLen > maxLen) return carryResult; //out of bounds -> result
  66.             List<String> consideringProposals = new LinkedList<>(); //
  67.             BigInteger newResult = BigInteger.ZERO;
  68.             for (String proposalBase : carryProposal) {
  69.                 for (String proposalExtension : alphabetList) {
  70.                     String proposal = proposalBase + proposalExtension;
  71.                     //approved proposal
  72.                     int approvedMemberCount = 0;
  73.                     for (Member member : memberList) {
  74.                         if (member.approves(proposal))
  75.                             approvedMemberCount++;
  76.                     }
  77.                     if (approvedMemberCount >= acceptThreshold) {
  78.                         newResult = newResult.add(BigInteger.ONE);
  79.                     }
  80.                     else {
  81.                         //considered proposal
  82.                         int disagreedMemberCount = 0;
  83.                         for (Member member : memberList) {
  84.                             if (!member.considers(proposal))
  85.                                 disagreedMemberCount++;
  86.                         }
  87.                         if (disagreedMemberCount < rejectThreshold) {
  88.                             consideringProposals.add(proposal);
  89.                         }
  90.                     }
  91.                 }
  92.             }
  93.             return validateAllProposals(curLen + 1, maxLen, carryResult.multiply(alphabetSize).add(newResult), consideringProposals);
  94.         }
  95.     }
  96.    
  97.     /***************************************************************************
  98.      *
  99.      */
  100.     public static class Member
  101.     {
  102.         private final Set<String> evaluationList;
  103.  
  104.         public Member(String... evaluationList) {
  105.             this.evaluationList = new HashSet<>(Arrays.asList(evaluationList));
  106.         }
  107.        
  108.         public boolean considers(String proposal) {
  109.             for (String evalCriteria : evaluationList)
  110.                 if (evalCriteria.startsWith(proposal))
  111.                     return true;
  112.             return false;
  113.         }
  114.        
  115.         public boolean approves(String proposal) {
  116.             for (String evalCriteria : evaluationList)
  117.                 if (proposal.startsWith(evalCriteria))
  118.                     return true;
  119.             return false;
  120.         }
  121.     }
  122.    
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement