一道牛客赛题引发的对string类的深思

智乃的数据库
先做一下总结:
由于不熟悉string而debug了一下午的代码,一道大模拟,问题出在了字符串的输入及提取上

  1. cin 读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据室,读入操作直接从缓冲区中取数据。
  2. clear会直接清空字符串,使得字符串大小为0
  3. 要对string类初始化大小,不然会输出s[0],s[1]···但是cout<

以下是debug且AC的code,详解见代码

#include 
using namespace std;
#define debug(x) cout << "*" << x << endl;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define lowbit(x) x &(-x);
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef unsigned int ui;        /// 0~(2^32)-1
typedef unsigned long long ull; ///0~(2^64)-1
const int inf = 0x3f3f3f3f;
const double eps = 1e-9;
const int P = 131; ///或者P=13331
const int N = 1e3 + 100;
const int M = 5e4 + 100;
const int mod = 1e9 + 7;
//#define int ll
int n, m, cnt, cnt1, tot, flag;
int a[N][N], lis[N], ans[N], vis[N];
string s(1000, ' '), t(1000, ' '), tmp(1000, ' '), wt;///要对string类初始化大小,不然会输出s[0],s[1]···但是cout<
map<string, int> mp;
void init()
{
    // cout << t.size() << endl;
    for (int i = t.size() - 2; i >= 0; i--)
    {
        if (t[i] == ' ')
        {
            // for (int i = 0; i < cnt; i++)
            //     printf("%c ", tmp[i]);
            // puts("");
            // cout << "空格" << tmp.size() << tmp << endl;
            wt = tmp.substr(0, cnt); ///截取字符串
            reverse(wt.begin(), wt.end());
            lis[++cnt1] = mp[wt];
            // cout << wt << endl;
            // cout << tmp[cnt] << endl;
            break;
        }
        if (t[i] == ',')
        {
            // for (int i = 0; i < cnt; i++)
            //     printf("%c ", tmp[i]);
            // puts("");
            // cout << ",,," << tmp.size() << tmp << endl;
            wt = tmp.substr(0, cnt); ///截取字符串
            // tmp = tmp.substr(0, cnt);【如果这样的话,tmp原本1000的大小也会被截取,使得tmp大小变短,导致cout<
            // cout << "tmpsize()=" << tmp.size() << endl;
            reverse(wt.begin(), wt.end());
            lis[++cnt1] = mp[wt];
            // cout << wt << endl;
            // tmp.clear();【clear会直接清空字符串,使得字符串大小为0】
            // cout << "tmp球球了" << tmp.size() << endl;
            cnt = 0;
            tmp[cnt] = t[--i];
            // cout << tmp[cnt] << endl;
            cnt++;
        }
        else
        {
            tmp[cnt] = t[i];
            // cout << tmp[cnt] << endl;
            cnt++;
        }
    }
    sort(lis + 1, lis + 1 + cnt1);
    //     for (int i = 1; i <= cnt1; i++)
    //         cout << lis[i] << endl;
}
void AC()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> s;
        mp[s] = i;
    }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    cin.get(); ///
    getline(cin, t);
    init();
    fill(ans, ans + 1001, 1);
    for (int i = 1; i <= n; i++)
    {
        if (vis[i])
            continue;
        vis[i] = 1;
        tot++;
        for (int j = i + 1; j <= n; j++)
        {
            if (vis[j])
                continue;
            bool f = 1;
            for (int k = 1; k <= cnt1; k++)
            {
                if (a[i][lis[k]] != a[j][lis[k]])
                {
                    f = 0;
                    break;
                }
            }
            if (f)
            {
                vis[j] = 1;
                ans[tot]++;
            }
        }
    }
    cout << tot << endl;
    for (int i = 1; i <= tot; i++)
        cout << ans[i] << " ";
}
signed main()
{
    IOS;
    int _ = 1;
    while (_--)
        AC();
    return 0;
}
///      |\_/|
///      | @ @   Woof!
///      |   <>              _
///      |  _/\------____ ((| |))
///      |               `--' |
///  ____|_       ___|   |___.'
/// /_/_____/____/_______|
/// I am here to guard this code, woof!

你可能感兴趣的:(C/C++,c++,开发语言)