public static double score(List<List<String>> candidates, List<List<String>> references, int n){
		candidates = generateNGramListOfList(candidates, n);
		references = generateNGramListOfList(references, n);
		double total = 0.0, total_clip = 0.0;
		List<Counter<String>> candidateCounterList = new ArrayList<Counter<String>>();
		for (List<String> candidate : candidates){
			Counter<String> candidateCounter = new Counter<String>();
			for (String word : candidate){
				candidateCounter.incrementCount(word, 1.0);
				total += 1.0;
			}
			candidateCounterList.add(candidateCounter);
		}
		
		List<Counter<String>> referenceCounterList = new ArrayList<Counter<String>>();
		for (List<String> reference : references){
			Counter<String> referenceCounter = new Counter<String>();
			for (String word : reference){
				referenceCounter.incrementCount(word, 1.0);
			}
			referenceCounterList.add(referenceCounter);
		}
		
		for (Counter<String> candidateCounter : candidateCounterList){
			for (Entry<String, Double> entry : candidateCounter.getEntrySet()){
				double maxMatchNum = 0.0;
				double maxAllowedMatchNum = entry.getValue();
				String matchWord = entry.getKey();
				for (Counter<String> referenceCounter : referenceCounterList){
					double countInThisReference = referenceCounter.getCount(matchWord);
					if ( countInThisReference > maxMatchNum && countInThisReference <= maxAllowedMatchNum){
						maxMatchNum = countInThisReference;
					}
				}
				total_clip += maxMatchNum;
			}
		}
		return total_clip/total;
	}