第一篇文章,以后會堅持寫的。
這道題目就是找r1,r2,c1,c2使得(r1,c1)和(r2,c1)相等,(r1,c2)和(r2,c2)相等
對效率有一定要求,不小心就會TLE
最初的算法是枚舉r1,r2然后橫向掃描,時間復雜度為Θ(n^3)無疑TLE。
后來經過改進將每個string與處映射成一個數,枚舉c1,c2然后從上往下掃描將(r,c1)(r,c2)字符串對應的兩個整數
組合成一個結構體作為map的鍵值,用r作為value,若鍵值已存在就為所求。
注意盡量將string映射成int的值存在一個二維數組中,map查找也是要時間的。
映射的值也盡量在輸入中計算,否則單獨計算也是要Θ(n^2)時間
最后勉勉強強AC了吧,不過效率還是有待改進,rank1 0.2幾秒就過了,有空還會改的。
附代碼
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<map> 5 #include<cstdio> 6 using namespace std; 7 struct kv 8 { 9 int k; 10 int v; 11 kv(int a,int b){ 12 k=a;v=b; 13 } 14 }; 15 bool operator < (const kv& a,const kv& b){ 16 if(a.k<b.k)return 1; 17 if(a.k>b.k)return 0; 18 19 return a.v<b.v; 20 } 21 int main() 22 { 23 //ios::sync_with_stdio(false); 24 25 int m,n; 26 while(cin>>n>>m){ 27 getchar(); 28 char line[100]; 29 string s[10020][11]; 30 int a[n][m]; 31 map<string,int> con; 32 int num=1; 33 34 for(int i=0;i<n;i++){ 35 gets(line); 36 int c=0; 37 int len=strlen(line); 38 for(int j=0;j<len;j++){ 39 if(line[j]==','){ 40 c++; 41 if(!con.count(s[i][c-1])){ 42 con[s[i][c-1]]=num++; 43 a[i][c-1]=num-1; 44 } 45 else a[i][c-1]=con[s[i][c-1]]; 46 } 47 else s[i][c].push_back(line[j]); 48 } 49 if(!con.count(s[i][c])){ 50 con[s[i][c]]=num++; 51 a[i][c]=num-1; 52 } 53 else a[i][c]=con[s[i][c]]; 54 } 55 56 int sign=0; 57 for(int c1=0;c1<m;c1++){ 58 for(int c2=c1+1;c2<m;c2++){ 59 map<kv,int> database; 60 for(int i=0;i<n;i++){ 61 kv k(a[i][c1],a[i][c2]); 62 if(database.count(k)){ 63 sign=1; 64 cout<<"NO"<<endl; 65 cout<<database[k]<<" "<<i+1<<endl; 66 cout<<c1+1<<" "<<c2+1<<endl; 67 goto ssss; 68 } 69 else { 70 database[k]=i+1; 71 } 72 } 73 } 74 } 75 ssss:; 76 if(sign==0)cout<<"YES"<<endl; 77 } 78 return 0; 79 }