标签:
第一篇文章,以后会坚持写的。
这道题目就是找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 }
标签:
原文地址:http://www.cnblogs.com/tooyoungtoosimple/p/4442912.html