1. 程式人生 > 其它 >[COCI2017-2018#1] Lozinke

[COCI2017-2018#1] Lozinke

技術標籤:c++

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,有失誤之處歡迎批評指正

本文章屬原創,轉載請註明

謝謝!