import java.io.*;
class pro{
String[] data=new String[30000];
String str;
int n,s,sx,strlong,datanumber;
int[] z=new int[1000];
int[] zz=new int[1000];
int dicnumber,phnumber,wordnumber;
String[] ph=new String[500];
String[] word=new String[500];
int[] nph=new int[500];
int[] nword=new int[500];
String[] dic=new String[5000];
double point,maxpoint;
int[] mvnumber=new int[1000];
int[][] mv=new int[1000][500];
int trial,time,tm;
public static void main(String args[]){
pro test=new pro();
}
pro(){
dicnumber=0;
readfile("ban.txt");
tm=0;
for(n=1;n<datanumber+1;n++){
str=data[n];
strlong=str.length();
maxpoint=-999;
for(trial=1;trial<10;trial++){
z[0]=1;
for(s=1;s<strlong;s++){
z[s]=0;
if(Math.random()>0.5)z[s]=1;
}
zz[1]=0;
sx=1;
for(s=1;s<strlong;s++){
if(z[s]==1)sx=sx+1;
if(z[s]==1)zz[sx]=s;
}
phnumber=sx;
for(s=1;s<phnumber;s++){
ph[s]=str.substring(zz[s],zz[s+1]);
}
s=phnumber;
ph[s]=str.substring(zz[s],strlong);
for(s=1;s<phnumber+1;s++){
nph[s]=0;
for(sx=1;sx<dicnumber+1;sx++){
if(ph[s].equals(dic[sx]))nph[s]=sx;
}
}
sx=nph[1];
point=fast(sx);
for(s=1;s<phnumber;s++){
point=pr(nph[s],nph[s+1])+point;
}
if(point>maxpoint)wordnumber=phnumber;
if(point>maxpoint)word=ph;
if(point>maxpoint)nword=nph;
if(point>maxpoint)maxpoint=point;
}
for(s=1;s<wordnumber+1;s++){
if(nword[s]==0)makedic(s);
}
for(s=1;s<wordnumber+1;s++){
if(nword[s]==0)nword[s]=makenword(s);
}
tm=tm+1;
if(tm>999)tm=1;
mvnumber[tm]=wordnumber;
for(s=1;s<wordnumber+1;s++){
mv[tm][s]=nword[s];
}
if(dicnumber>1000)diet();
System.out.println(n);
System.out.println(dicnumber);
}
}
void diet(){
int[] num=new int[5000];
int[] ch=new int[5000];
int[][] newmv=new int[1000][500];
String[] newdic=new String[5000];
int newdicnumber;
int s,sx,n,nx;
for (s=1;s<dicnumber+1;s++){
num[s]=0;
}
for (s=1;s<1000;s++){
for(sx=1;sx<mvnumber[s]+1;sx++){
nx=mv[s][sx];
num[nx]=num[nx]+1;
}
}
nx=0;
for (s=1;s<dicnumber+1;s++){
if(num[s]>1)nx=nx+1;
if(num[s]>1)ch[s]=nx;
}
newdicnumber=nx;
for (s=1;s<1000;s++){
for(sx=1;sx<mvnumber[s]+1;sx++){
n=mv[s][sx];
nx=ch[n];
newmv[s][sx]=nx;
}
}
for (s=1;s<dicnumber+1;s++){
nx=ch[s];
if(nx>0)newdic[nx]=dic[s];
}
dic=newdic;
mv=newmv;
dicnumber=newdicnumber;
}
int makenword(int s){
int sxs;
sxs=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))sxs=sx;
}
return sxs;
}
void makedic(int s){
int h;
h=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))h=100;
}
if(h<50)dicnumber=dicnumber+1;
if(h<50)dic[dicnumber]=word[s];
}
double pr(int m1,int m2){
int t1,t2;
int pr1,pr2;
int h;
double px;
px=0.01;
pr1=0;
pr2=0;
for(t1=1;t1<1000;t1++){
for(t2=1;t2<mvnumber[t1];t2++){
if(mv[t1][t2]==m1)pr1=pr1+1;
}
}
for(t1=1;t1<1000;t1++){
for(t2=1;t2<mvnumber[t1];t2++){
h=0;
if(mv[t1][t2]==m1)h=h+1;
if(mv[t1][t2+1]==m2)h=h+1;
if(h==2)pr2=pr2+1;
}
}
if(pr1>0)px=pr2/pr1;
if(px<0.01)px=0.01;
return px;
}
double fast(int m1){
int t1,pr1,pr2,h;
double px;
px=0.01;
pr1=0;
pr2=0;
for(t1=1;t1<1000;t1++){
if(mvnumber[t1]>0)pr1=pr1+1;
}
for(t1=1;t1<1000;t1++){
h=0;
if(mvnumber[t1]>0)h=h+1;
if(mv[t1][1]==m1)h=h+1;
if(h==2)pr2=pr2+1;
}
if(pr1>0)px=pr2/pr1;
if(px<0.01)px=0.01;
return px;
}
void readfile(String file){
String st;
BufferedReader br;
s=0;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"SJIS"));
while((st = br.readLine()) != null) {
s=s+1;
data[s]=st;
}
br.close();
} catch (IOException e) {System.out.println(e);}
datanumber=s;
}
}
最終更新:2011年05月25日 13:04