字符串处理相关的题,直接暴力判重会TL,要进行一些优化。
将每个不同的字符串用map编号,然后每次取两列进行扫描。后续处理中字符串的对比都由map赋予的编号进行。感觉写个hash会快很多。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<string,int> ID;
int IDcache(string s){
if(!ID.count(s)) ID[s]=ID.size()-1;
return ID[s];
}
int main(){
int r,c;
int from[10005][11];
while(~scanf("%d%d",&r,&c)){
getchar();
string line,s;
for(int i=0;i<r;i++){
getline(cin,line);
line+=',';
int num=0;
for(int j=0;j<line.size();j++){
if(line.at(j)==','){
from[i][num++]=IDcache(s); //将字符串编号
s.clear();
}
else s+=line.at(j);
}
}
int kase=0;
for(int i=0;i<c-1;i++){
for(int j=i+1;j<c;j++){ //选择两列
pair<int,int> p;
map<pair<int,int>,int> id; //用两列字符串的编号进行判重
for(int k=0;k<r;k++){ //再选择一行进行扫描
p.first=from[k][i];
p.second=from[k][j];
if(id.count(p)){
kase=1;
printf("NO\n%d %d\n%d %d\n",id[p]+1,k+1,i+1,j+1);
break;
}
else{
id[p]=k;
}
}
if(kase) break;
}
if(kase) break;
}
if(!kase) printf("YES\n");
}
return 0;
}