[COCI2017-2018#1] Lozinke
阿新 • • 發佈:2021-02-09
技術標籤: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];
然後發現了一個神仙函式,嗯,用法如下:
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,有失誤之處歡迎批評指正
本文章屬原創,轉載請註明