題目描述:這哥們在機場聽公告,假設機場說的公告每種語言含有的短語數是相同的,他有的詞能聽出什麼語言,有的詞聽不出就是“unknown”,問一共有多少種語言,多種滿足情況按照從大到下的順序輸出。
解題分析:簡單模擬就好,沒什麼難度。
代碼如下:
#include <cstdio>
#include <string>
#include <iostream>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;
vector <string> phrase;
int n;
set <int> ans;
bool solve(int m)
{
set <string> lang;
for(int i=0; i<n; i+=m)
{
string cur;
for(int j=0; j<m; j++)
{
if(phrase[i+j]!="unknown")
{
if(cur.empty())
{
cur=phrase[i+j];
}
else
{
if(cur!=phrase[i+j]) return false;
}
}
}
if(!cur.empty())
{
if(!lang.count(cur))
{
lang.insert(cur);
}
else
{
return false;
}
}
}
return true;
}
int main()
{
string str;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
cin >> str;
phrase.push_back(str);
}
for(int i=1; i<=n; i++)
{
if(n%i==0)
if(solve(i)) ans.insert(n/i);
}
if(ans.empty()) cout << "Igor is wrong." << endl;
else
{
set <int >::iterator it;
for(it=ans.begin();it!=ans.end();it++)
{
if(it==ans.begin()) cout << *it;
else cout << " " << *it ;
}
cout << endl;
}
return 0;
}
//這是當初彬佬所寫,爲了省時間給每個字符串編了個號,但實際上這題數據很少,不耗時間,下面是不編號的代碼,和上面的時間相同。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;
vector <string> phrase;
int n;
set <int> ans;
bool solve(int m)
{
set <string> lang;
for(int i=0; i<n; i+=m)
{
string cur;
for(int j=0; j<m; j++)
{
if(phrase[i+j]!="unknown")
{
if(cur.empty())
{
cur=phrase[i+j];
}
else
{
if(cur!=phrase[i+j]) return false;
}
}
}
if(!cur.empty())
{
if(!lang.count(cur))
{
lang.insert(cur);
}
else
{
return false;
}
}
}
return true;
}
int main()
{
string str;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
cin >> str;
phrase.push_back(str);
}
for(int i=1; i<=n; i++)
{
if(n%i==0)
if(solve(i)) ans.insert(n/i);
}
if(ans.empty()) cout << "Igor is wrong." << endl;
else
{
set <int >::iterator it;
for(it=ans.begin();it!=ans.end();it++)
{
if(it==ans.begin()) cout << *it;
else cout << " " << *it ;
}
cout << endl;
}
return 0;
}