CSDN上苦战1个小时AC
先看题
【题目描述】
最近,超级流行的社交网络秘密网络出现了用户信息的泄露。
在机密信息中是所有用户的密码。
Mihael,一个最近一直在探索计算机安全的年轻学生,发现整个事情非常有趣。在尝试社交网络时,他发现了另一个安全漏洞!当你输入任何字符串时
当一个子字符串等于实际的密码时,登录将会成功。例如,如果密码为abc的用户输入了一个字符串abc、abcd或imaabcnema,系统将成功地将其登录,而axbc的登录将失败。
Mihael想知道有多少个不同用户的有序对,第一个用户使用自己的密码可以作为第二个用户登录。
【输入格式】
输入的第一行包含正整数N,表示用户的数量。
下面的每个N行都包含用户密码。
密码至少有一个和十个英文字母的小写字母。
【输出格式】
输出共一行,输出来自任务的有序对的数量。
【输入样例1】
3
aaa
aa
abb
【输出样例1】
1
【输入样例2】
3
x
x
xy
【输出样例2】
4
【输入样例3】
5
mir
mirta
ta
ir
t
【输出样例3】
6
首先二话不说
char arr[2001][11]
然而。。。
两层循环就4000001了
所以。。。
string arr[2001];
然后发现了一个神仙函数,嗯,用法如下:
arr.find("bizhuzuishuai") != string::npos
arr.find("bozhuzuishuai") != string::npos
npos是string类里面存放不存在的位置的。
相当于在arr字符串里找叫做“bozhuzuishuai”的字符串,未找到返回npos。
然后:
#include<bits/stdc++.h>
using namespace std;
string arr[2001];
int n,ans;
int i;
int main(){
cin>>n;
cin.get();
for(i = 1;i <= n;i++){
cin>>arr[i];
}
for(i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if((arr[i].find(arr[j]) != string::npos)){
ans++;
}
}
}
cout<<ans;
return 0;
}
但是冷zi静xin分ti析jiao 后发现:
。。。。。。
原来是这里
(arr[i].find(arr[j]) != string::npos)
因为自己可以打开自己的密码,所以
if((arr[i].find(arr[j]) != string::npos)&&(i != j)){
于是就AC了。
嗯。
没有然后了,这里附上代码:
#include<bits/stdc++.h>
using namespace std;
string arr[2001];
int n,ans;
int i;
int main(){
cin>>n;
cin.get();
for(i = 1;i <= n;i++){
cin>>arr[i];
}
for(i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if((arr[i].find(arr[j]) != string::npos)&&(i != j)){
ans++;
}
}
}
cout<<ans;
return 0;
}
第一次发CSDN,有失误之处欢迎批评指正
本文章属原创,转载请注明
谢谢!