[COCI2017-2018#1] Lozinke

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];

然后发现了一个神仙函数find,嗯,用法如下:

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,有失误之处欢迎批评指正

本文章属原创,转载请注明

谢谢!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值