■1215 Co-occurrence Search
しゃくとり法で解くことが出来る.入力がややこしく,無限ループによるTLEを連発してしまった.import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
public class Main{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
char[] s, key;
void run(){
for(;;){
StringBuffer lines=new StringBuffer();
for(;;){
String line=sc.nextLine();
if(line.equals("")){
break;
}
lines.append(line);
}
s=lines.toString().toCharArray();
key=sc.nextLine().toCharArray();
solve();
if(sc.hasNext()){
sc.nextLine();
}else{
break;
}
}
System.out.flush();
}
void solve(){
int i=0, j=0;
int num=0;
int n=s.length;
int min=INF;
int cMin=0, iMin=0, jMin=0;
int nKey=0;
boolean[] isKey=new boolean[256];
for(char c : key){
isKey[c]=true;
}
for(boolean b : isKey){
nKey+=b?1:0;
}
int[] count=new int[256];
for(;;){
for(; j<n&&num<nKey; j++){
if(isKey[s[j]]&&count[s[j]]++==0){
num++;
}
}
if(num<nKey){
break;
}
if(j-i<min){
iMin=i;
jMin=j;
min=j-i;
cMin=1;
}else if(j-i==min){
cMin++;
}
if(isKey[s[i]]&&--count[s[i]]==0){
num--;
}
i++;
}
println(cMin+"\n");
if(cMin>0){
String ans=new String(s, iMin, jMin-iMin);
for(int k=0; k<(ans.length()-1)/72+1; k++){
println(ans.substring(k*72, min((k+1)*72, ans.length())));
}
println("");
}
}
void debug(Object... os){
System.err.println(Arrays.deepToString(os));
}
void print(String s){
System.out.print(s);
}
void println(String s){
System.out.println(s);
}
public static void main(String[] args){
// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
new Main().run();
}
}
0 件のコメント:
コメントを投稿