Database UVA 1592数据库

本文介绍了一种用于验证表格数据唯一性的算法实现,通过遍历表格中的每一列,并检查任意两列组合是否能构成唯一的标识,从而确保数据的唯一性。文章详细解释了算法的具体步骤,包括使用结构体和自定义比较函数来优化查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:两列两列的遍历,从上到下扫描各行,把每一行c1,c2两列的内容作为一个二元数组储存到一个map当中
(将输入的每一个不同的字符串分配一个编号(和集合栈计算机做法类似));如果map的键值中已经存在这个二元组
,则二元组映射的就是所求的r1,而当前行就是r2。

还需要注意一点:结构体用于map,set容器时必须重载<运算符,否则会出错,这是因为STL中的排序默认都是< 排序。可以通过<号找到相等元素,通过左右互换元素,不大于也不小于那肯定就是等于了。

  1. #include<iostream>
  2. #include<vector>
  3. #include<map>
  4. #include<string>
  5. using namespace std;
  6. const int row=10010;
  7. const int col=15;
  8. vector<int>table[row];         //用于储存表格中各字符串对应的数字编号
  9. vector<string>vec;              //根据编号取字符串vec[int];
  10. map<string,int>mp;            //将字符串映射对应编号

  11. int getID(string str){
  12.     if(mp.count(str))return mp[str];
  13.     else {
  14.         vec.push_back(str);
  15.         mp[str]=vec.size()-1;
  16.         return mp[str];
  17.     }
  18. }
  19. void read(int n){
  20.     string str;
  21.     getchar();//注意这里(对于每组数据,当输入数字后要用gerchar()吃掉换行,否则会错(就是这个错误找了很久)) 
  22.     for(int i=0;i<n;i++){
  23.         while(true){
  24.             char ch=getchar();
  25.             if(ch=='\n' || ch=='\r'){
  26.                 if(!str.empty()) table[i].push_back(getID(str));
  27.             str.clear();
  28.             break;}
  29.             if(ch==','){
  30.                 table[i].push_back(getID(str));
  31.                 str.clear();
  32.             }
  33.             else str+=ch;
  34.         }
  35.     }
  36. }

  37. struct note{
  38.     int x,y;
  39.     bool operator<(const note & n)const {
  40.         return this->x<n.x || this->x==n.x && this->y<n.y;
  41.     }
  42. };

  43. map<note,int>mp2;
  44. void solve(int n,int m){
  45.     for(int c=0;c<m;c++){
  46.         for(int j=c+1;j<m;j++){
  47.             mp2.clear();                  //每两列结束都要清空map容器
  48.             for(int r=0;r<n;r++){
  49.             int c1=table[r][c];
  50.             int c2=table[r][j];
  51.             note nt;
  52.             nt.x=c1;
  53.             nt.y=c2;
  54.             if(!mp2.count(nt))mp2[nt]=r;
  55.             else {
  56.                 printf("NO\n");
  57.                 printf("%d %d\n",mp2[nt]+1,r+1);
  58.                 printf("%d %d\n",c+1,j+1);
  59.                 return ;
  60.             }
  61.            }
  62.         }
  63.     }
  64.     printf("YES\n");
  65. }
  66. int main(){
  67.     int n,m;
  68.     while(cin>>n>>m){
  69.         read(n);
  70.         solve(n,m);
  71.         for(int i=0;i<n;i++)table[i].clear();
  72.         vec.clear();
  73.         mp.clear();
  74.     }
  75.     return 0;
  76. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值